Может войдёшь?
Черновики Написать статью Профиль

Маршрутизация

перевод документация 3.x

  1. 1. Основы
    1. 1.1. Подстановка (шаблоны)
  2. 2. Событие «404»
  3. 3. Фильтры
    1. 3.1. Фильтрация по шаблону
    2. 3.2. Глобальные фильтры
  4. 4. Группы маршрутов
  5. 5. Именованные маршруты
  6. 6. HTTPS-маршруты
  7. 7. Маршруты пакетов
  8. 8. Маршрутизация контроллеров
  9. 9. Командная строка

Основы

В Laravel используются последние возможности PHP 5.3 для создания простой и понятной маршрутизации. Благодаря этому, с одинаковой легкостью можно проектировать, как простые веб-приложения, так и сложные программные интерфейсы. Маршруты обычно задаются в application/routes.php.

В отличии от других сред программирования для PHP в Laravel маршрутизация может делаться двумя способами. Контроллеры — самый распространённый шаблон проектирования, однако кроме них вы можете встраивать свой код напрямую в маршруты. Эта возможность особенно полезна, если вы пишите небольшой сайт всего на пару страниц и не хотите создавать пачку контроллеров с дюжиной методов, либо свалить все методы в один контроллер и затем вручную направлять запросы, которые к нему поступают.

В примере ниже первый параметр — адрес маршрута, который вы регистрируете в маршрутизаторе (Router). Второй параметр — функция, содержащая логику для этого маршрута. Маршруты регистрируются без задания ведущего слеша (/) — единственное исключение — корневой маршрут, который состоит из одного слеша (PHP'/').

Маршруты обрабатываются в порядке их регистрации, поэтому «всеядный» («catch-all») маршрут должен быть зарегистрирован после всех остальных (обычно в конце routes.php), иначе очередь до них не дойдёт.

Регистрация маршрута, отвечающего на GET-запрос /:

PHP
Route::get('/', function () {
  return 
"Привет, мир!";
});

Регистрация маршрута для любого HTTP-запроса на / (GET, POST, PUT и DELETE):

PHP
Route::any('/', function () {
  return 
"Привет, мир!";
});

Регистрация для отдельных HTTP-запросов:

PHP
Route::post('user', function () {
  
// обработчик POST-запроса на /user
});

Route::put('user/(:num)', function  ($id) {
  
// обработчик PUT-запроса на /user/<число>
});

Route::delete('user/(:num)', function ($id) {
  
// обработчик DELETE-запроса на /user/<число>
});

Регистрация одного маршрута для одного адреса, но нескольких HTTP-запросов:

PHP
Router::register(array('GET''POST'), $uri$callback);

Подстановка (шаблоны)

Задание части URI как последовательности цифр:

PHP
Route::get('user/(:num)', function ($id) {
  
// код обработчика - например, по запросу /user/123
});

Буквенно-цифровой сегмент:

PHP
Route::get('post/(:any)', function ($title) {
  
// код обработчика - например, по запросу /post/sY34v
});

На самом деле (:any) допускает также точки, проценты, дефисы и подчёркивания: . % - _прим. пер.

Задание необязательной части URI:

PHP
Route::get('page/(:any?)', function ($page 'index') {
  
// сработает для /page ($page устанавливается в 'index') и для /page/chat ($page = 'chat').
});

Знак вопроса (?) может быть добавлен к любому шаблону: (:num?), (:any?), (:all?) (all допускает любой символ включая /). — прим. пер.

Событие «404»

Если запрос не был обработан ни одним маршрутом возникнет событие «404». Умолчательный обработчик для него задан в application/routes.php:

PHP
Event::listen('404', function () {
  return 
Response::error('404');
});

Вы можете изменить его в соответствии с требованиями вашего приложения.

Связанные темы:

Фильтры

Фильтры маршрутов могут выполняться до («предварительные фильтры») или после («постфильтры») того, как обработчик определённого запроса был вызван. Фильтры обычно задаются в application/routes.php.

Предварительный фильтр может вернуть значение — в этом случае оно используется как ответ клиенту и обработчик маршрута не вызывается — это весьма удобно для проверок пользовательских прав и подобных вещей.

Пост-фильтр принимает объект PHPResponse, возвращённый выполненным ||маршрутом|| или предварительным фильтром.

Регистрация фильтра:

PHP
Route::filter('filter', function () {
  return 
Redirect::to('home');
});

Добавление фильтра к маршруту:

PHP
Route::get('blocked', array('before' => 'filter', function () {
  return 
View::make('blocked');
}));

Добавление постфильтра:

PHP
Route::get('download', array('after' => 'log', function () {
  
// код маршрута.
}));

Добавление нескольких фильтров одному маршруту:

PHP
Route::get('create', array('before' => 'auth|csrf', function () {
  
// код маршрута после выполнения фильтров "auth" и "csrf".
}));

Передача параметров для фильтров:

PHP
Route::get('panel', array('before' => 'role:admin', function () {
  
// код маршрута; фильтр "role" получит параметр "admin".
}));

Фильтрация по шаблону

Иногда вам может понадобиться вызвать фильтр для всех запросов, подходящих под определённую маску. Например, фильтр auth может быть применён ко всем запросам, начинающимся на admin. Вот как это делается:

PHP
Route::filter('pattern: admin/*''auth');

Глобальные фильтры

В Laravel есть два глобальных фильтра, вызываемых до и после выполнения любого маршрута. Вы можете найти их в application/routes.php. Из них удобно запускать какие-то общие пакеты или задавать настройки.

Группы маршрутов

Группы маршрутов позволяют вам задавать общие свойства для нескольких маршрутов, что делает код упорядоченным и удобным для чтения.

PHP
Route::group(array('before' => 'auth'), function() {
  
Route::get('panel', function () {
    
// маршрут "panel" с добавленным предварительным фильтром "auth".
  
});

  
Route::get('dashboard', function () {
    
// маршрут "dashboard" - также с фильтром "auth".
  
});
});

Именованные маршруты

Генерация URL или переадресаций с использованием URI самого маршрута может вызвать проблемы, если последний поменяет свой адрес. Это может быть решено присвоением маршруту имени и использованием его вместо настоящего адреса — если он поменяется все созданные ссылки автоматически укажут на новое расположение и дополнительных изменений не потребуется.

Регистрация именованного маршрута:

PHP
Route::get('/', array('as' => 'home', function () {
  return 
"Привет, мир!";
}));

Создание адреса для именованного маршрута:

PHP
$url URL::to_route('home');

Переадресация на именованный маршрут:

PHP
return Redirect::to_route('home');

Как только вы присвоили маршруту имя вы можете легко проверить, соответствует ли ему текущий запрос:

PHP
if (Request::route()->is('home')) {
  
// маршрут "home" обрабатывает текущий запрос.
}

HTTPS-маршруты

Регистрируя маршрут вы можете задать ему атрибут https — в этом случае при генерации URL или переадресации будет использован безопасный протокол HTTPS.

Регистрация HTTPS-маршрута:

PHP
Route::get('login', array('https' => true, function () {
  return 
View::make('login');
}));

Регистрация с помощью метода PHPsecure():

PHP
Route::secure('GET''login', function () {
  return 
View::make('login');
});

Маршруты пакетов

Пакеты — система модулей Laravel. Пакеты могут быть легко настроены для обработки запросов в вашем приложении. Больше информации дано в соответствующей статье, а пока просто знайте, что маршруты не только могут быть использованы для создания доступа к функциональности пакета, но они также могут регистрироваться самими пакетами.

Откроем файл application/bundles.php.

Регистрация пакета для обработки определённого пути:

PHP
return array(
  
'admin' => array('handles' => 'admin'),
);

Как вы видите, в массиве мы указали опцию handles — это позволяет Laravel вызывать пакет admin при любом запросе, начинающимся на admin/.

Теперь вы можете регистрировать маршруты для своего пакета — создайте файл routes.php в его папке и добавьте туда следующее...

Регистрация обработчика для запроса в корень пакета:

PHP
Route::get('(:bundle)', function () {
  return 
'Вы открыли страницу пакета admin.';
});

Изучим этот пример. Что означает (:bundle)? Эта строка будет заменена на то самое значение опции handles, которое мы указали выше, регистрируя наш пакет. Это делает наш код «сухим» (см. «DRY») и подзволяет пользователям нашего пакета изменять его коренной адрес без последствий для зарегистрированных им маршрутов. Удобно, не так ли?

Регистрация маршрута для пакета:

PHP
Route::get('(:bundle)/panel', function () {
  return 
"Запрос admin/panel был успешно обработан.";
});

Маршрутизация контроллеров

Использование контроллеров — ещё один из способов управление логикой приложения. Если вы ещё с ними не знакомы прочитайте эту статью в документации и возвращайтесь к этому разделу.

Важно отметить, что все маршруты в Laravel должны быть явно зарегистрированы — в том числе принадлежащие контроллерам. Это значит, что их методы, которые не были явно зарегистрированы не будут доступны. Однако существует возможность сделать это автоматически для всех методов одного или нескольких контроллеров — обычно это делается в application/routes.php,

Скорее всего вы просто хотите зарегистрировать все имеющиеся в вашем приложении контроллеры — в папке controllers. Вы можете сделать это одной простой строчкой:

PHP
Route::controller(Controller::detect());

Метод PHPController::detect просто возвращает массив всех контроллеров, определённых в вашем проекте.

Если вы хотите автоматически зарегистрировать все контроллеры в определённом пакете, то просто передайте ему имя пакета. Это имя не задано, сканируется папка проекта (application/controllers).

Регистрация котроллеров пакета «admin»:

PHP
Route::controller(Controller::detect('admin'));

Регистрация котроллера «home»:

PHP
Route::controller('home');

Регистрация нескольких контроллеров:

PHP
Route::controller(array('dashboard.panel''admin'));

Как только контроллер зарегистрирован вы можете вызывать его методы, используя следующий URL:

http://localhost/controller/method/arguments

Это адресное соглашение похоже на применяемое в CodeIgniter и других распространённых фреймворках, где первый сегмент — имя контроллера, второй — метод, а остальные передаются в него в качестве параметров. Если метод не указан, используется index.

Регистрация маршрута, указывающего на действие контроллера:

PHP
Route::get('welcome''home@index');

Регистрация маршрута для действие и с постфильтром «log»:

PHP
Route::get('welcome', array('after' => 'log''uses' => 'home@index'));

Командная строка

Вы можете тестировать свои маршруты используя интерфейс командной строки Laravel — «Artisan» — для этого просто укажите тип HTTP-запроса и URL. Ответ будет выведен в консоль используя функцию var_dump.

Вызов маршрута, используя «Artisan»:

shphp artisan route:call get api/user/1

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.