Простой и когда-то элегантный роутинг фреймворка CodeIgniter полностью обновится в четвертой версии. Лонни Эцелл в очередной раз делится очень интересной информацией о новых возможностях. В этот раз речь пойдет о маршрутизации.
Основы маршрута
Чтобы освежить память вспомним, что в версии 3x маршрутизация была определена в простом массиве, где ключом был URl, а значением какой-либо элемент, куда необходимо было сделать направление.
Это был простой, элегантный и отлично работающий способ маршрутизации, что-то вроде этого:
$route['join'] = 'home/register';
$route['login'] = 'home/login';
$route['products/(:any)/details'] = 'products/show/$1';
Способности маршрутизации в других фреймворках превзошли эту простую элегантность. Даже в сообществе CodeIgniter, было несколько улучшенных маршрутизаторов способных послужить достойной альтернативой стандартному роутингу.
Итак, пришло время для обновления!
Первое, что необходимо было сделать — это возможность использования класса, вместо простого массива. Новые маршруты будут выглядеть следующим образом:
$routes->add('join', 'Home::register');
$routes->add('login', 'Home::login');
$routes->add('products/(:segment)', 'Products::show/$1');
Join маршрут направляется на главный контроллер, и его метод register(). Маршрут Products направляется на контроллер Products, с захваченным (:segment) передается на show () метод.
Модуль типа Функциональность
Почему новый формат? Потому что никто не хочет быть ограниченным /application/Controllers каталогом. Теперь появится возможность проложить маршрут к любому классу/методу.
Например, если у вас есть модуль Blog в пространстве имен AppBlog, то вы можете создать несколько маршрутов:
$routes->add('blog', 'AppBlogBlog::index');
$routes->add('blog/category/(:segment)', 'AppBlogBlog::byCategory/$1');
Если контроллер Blog живет в каталоге application/Controllers, отлично. Но если вы хотите переместить его в его собственную папку, скажем, application/Blog, вы можете обновить конфиг файл автозагрузки.
Замыкания
Маршруты больше не должны отображаться на контроллер. Если у вас есть простой процесс, вы можете указать путь к анонимной функции или замыканию, которое будет выполняться на месте любого контроллера.
$routes->add('pages/(:segment)', function($segment)
{
if (file_exists(APPPATH.'views/'.$segment.'.php'))
{
echo view($segment);
}
else
{
throw new CodeIgniterPageNotFoundException($segment);
}
});
Заполнители
Все кто пользовался CodeIgniter привыкли к двум типам заполнителя:
:num будет соответствовать сегмент, содержащий только цифры.
:any будет соответствовать сегмент с любыми символами.
Теперь в CodeIgniter 4 будут внедрены следующие заполнители:
- (:any) будет соответствовать сегмент с любыми символами.
- (:segment) будет соответствовать сегмент с любыми символами за исключением прямой черты (слэша /).
- (:num) будет соответствовать сегмент, содержащий только цифры.
- (:alpha) будет соответствовать сегмент, содержащий любой символ
- (alphanum) будет соответствовать сегмент, содержащий комбинации из символов или чисел,
Также вы можете создать свой собственные правила маршрутизации, назначив регулярное выражение для него, поместив код в верхнюю часть файла маршрутизации.
$routes->addPlaceholder('uuid', '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}');
$routes->add('users/(:uuid)', 'Users::show/$1');
HTTP Глаголы
Маршруты, добавленные таким образом будут доступны через HTTP-глаголы, чтобы проверить, является ли запрос GET, POST, PATCH, или даже из командной строки.
routes->get('products', 'Product::feature');
$routes->post('products', 'Product::feature');
$routes->put('products/(:num)', 'Product::feature');
$routes->delete('products/(:num)', 'Product::feature');
$routes->match(['get', 'post'], 'products/edit/(:num)', 'Product::edit/$1');
$routes->cli('maintenance/on', 'CLITools::maintenanceModeOn');
Создание стандартных ресурсов маршрутов
При работе с API лучше держать стандартный набор отображения маршрутов к тем же методам в каждом контроллере, просто чтобы сделать обслуживание проще. Вы можете легко сделать это с помощью метода ресурсов:
При работе с API-х лучше держать стандартный набор отображения маршрутов к тем же методам в каждом контроллере, просто чтобы сделать обслуживание проще. Вы можете легко сделать это с помощью метода ресурсов:
$routes->resources('photos');
Это создаст 5 стандартных маршрутов для ресурса:
HTTP Verb | Path | Action | Used for... |
---|---|---|---|
GET | /photos | listAll | display a list of photos |
GET | /photos/{id} | show | display a specific photo |
POST | /photos | create | create a new photo |
PUT | /photos/{id} | update | update an existing photo |
DELETE | /photos/{id} | delete | deletes an existing photo |
Нет больше магии
По умолчанию, URI, будет пытаться быть согласованным с контроллером / методом, если для него не существует маршрута. Это может быть легко обработано путем включения и выключения функции AutoRoute:
$routes->setAutoRoute(false);
Теперь, только маршруты, которые были определены, могут работать до приложения.
Группы
Маршруты могут быть сгруппированы вместе под общим префиксом. Это очень полезный функционал для организации маршрутизации.
$routes->group('admin', function($routes) {
$routes->add('users', 'AdminUsers::index');
$routes->add('blog', 'AdminBlog::index');
});
Эти маршруты будут теперь все будут доступны под сегментом admin в URI, как:
example.com/admin/users
example.com/admin/blog
Окружения групп
Другая форма группировки, environment() — позволяет ограничить некоторые маршруты для работы только в конкретной среде.
$routes->environment('development', function($routes)
{
$routes->add('builder', 'ToolsBuilder::index');
});
Перенаправление Старые маршруты
Если ваш сайт имеет несколько страниц, которые были перемещены, вы можете назначить перенаправление маршрутов, которые будут получать 302 (временный) статус и отправлять пользователя на нужную страницу.
$routes->addRedirect('users/about', 'users/profile');
Это позволит перенаправить любые маршруты, соответствующие users/about на новое место users/profile.
Использование маршрутов в представлениях
Одной из наиболее слабой вещью при создании ссылок внутри отображения, является изменение их адреса. Теперь CodeIgniter 4 предоставляет несколько различных инструментов, чтобы помочь обойти эту проблему.
Именованные маршруты
В любое время вы создать маршрут и можете назначить пользовательское имя на маршрут. Для возврата правильного относительного URL необходимо применять функцию route_to ():
// Create the route
$route->add('auth/login', 'Users::login', ['as' => 'login']);
// Use it in a view
<a href="<?= route_to('login') ?>">Login</a>
Именованные маршруты, используемые таким образом, могут также принимать параметры:
// The route is defined as:
$routes->add('users/(:id)/gallery(:any)', 'Galleries::showUserGallery/$1/$2', ['as' => 'user_gallery');
// Generate the relative URL to link to user ID 15, gallery 12
// Generates: /users/15/gallery/12
<a href="<?= route_to('user_gallery', 15, 12) ?>">View Gallery</a>
Обратная маршрутизация
Для еще более точного управления, вы можете использовать функцию route_to (), чтобы найти маршрут, который соответствует контроллеру / методу и параметрам.
// The route is defined as:
$routes->add('users/(:id)/gallery(:any)', 'Galleries::showUserGallery/$1/$2');
// Generate the relative URL to link to user ID 15, gallery 12
// Generates: /users/15/gallery/12
<a href="<?= route_to('Galleries::showUserGallery', 15, 12) ?>">View Gallery</a>
Глобальные параметры
Любой из методов создания маршрута можно передать массив опций, которые могут помочь дополнительно уточнить маршрут, делая такие вещи, как:
- назначить пространство имен для контроллеров
- ограничить маршрут к определенному имени хоста, или суб-домену
- сместить совпавшие параметры, чтобы игнорировать один или несколько (которые могли быть использованы для языка, версии, и т.д.)
Нужно больше? Настройте сами!
Если вы обнаружите, что вам нужно что-то отличное от стандартного маршрутизатора, то вы можете заменить класс RouteCollection вашим собственным и использовать свое решение. Класс RouteCollection отвечает только для чтения и разбора маршрутов, а не для выполнения фактической маршрутизации, так что все будет работать с вашим решением.
Более подробная информации появится с выходом официальной документации.
Ссылки по теме
Блог Лонни Эцелла: Routes in CodeIgniter 4
CodeIgniter Wikipedia: ru.wikipedia.org/wiki/CodeIgniter
Официальный сайт CodeIgniter: www.codeigniter.com
Официальный форум CodeIgniter: forum.codeigniter.com
CodeIgniter 4: https://habrahabr.ru/post/275657/
CI Community Apps: https://habrahabr.ru/post/276375/
Requests и Responses в CodeIgniter 4: https://habrahabr.ru/post/278489/
Внедрение зависимостей в CodeIgniter 4: https://habrahabr.ru/post/278641/
Автор: condor-bird