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

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

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

  1. 1. Простейшая маршрутизация
  2. 2. Параметры маршрутов
  3. 3. Фильтры маршрутов
    1. 3.1. Фильтры по шаблону
    2. 3.2. Классы фильтров
  4. 4. Именованные маршруты
  5. 5. Группы маршрутов
    1. 5.1. Доменная маршрутизация
    2. 5.2. Префикс пути
  6. 6. Привязка моделей
  7. 7. Ошибки 404
  8. 8. Маршрутизация в контроллер
Этот перевод актуален для англоязычной документации на (ветка 4.2) , (ветка 4.1) и (ветка 4.0). Опечатка? Выдели и нажми Ctrl+Enter.

Простейшая маршрутизация

Большинство маршрутов (routes) вашего приложения будут определены в файле app/routes.php. В Laravel, простейший маршрут состоит из URI (пути) и функции-замыкания.

Простейший GET-маршрут

PHP
Route::get('/', function () {
  return 
'Hello World';
});

Простейший POST-маршрут

PHP
Route::post('foo/bar', function () {
  return 
'Hello World';
});
+ 4.1

добавлено в 4.1 ()

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

PHP
Route::match(array('GET''POST'), '/', function()
{
  return 
'Hello World';
});

Регистрация маршрута для любого типа HTTP-запроса

PHP
Route::any('foo', function () {
  return 
'Hello World';
});

Регистрация маршрута, всегда работающего через HTTPS

PHP
Route::get('foo', array('https', function() {
  return 
'Must be over HTTPS';
}));

Вам часто может понадобиться сгенерировать URL к какому-либо маршруту — для этого используется метод PHPURL::to():

PHP
$url URL::to('foo');

Параметры маршрутов

PHP
Route::get('user/{id}', function ($id) {
  return 
'User '.$id;
});

Необязательные параметры маршрута

PHP
Route::get('user/{name?}', function ($name null) {
  return 
$name;
});

Необязательные параметры со значением по умолчанию

PHP
Route::get('user/{name?}', function ($name 'John') {
  return 
$name;
});

Маршруты с соответствием пути регулярному выражению

PHP
Route::get('user/{name}', function ($name) {
  
//
})
->
where('name''[A-Za-z]+');

Route::get('user/{id}', function ($id) {
  
//
})
->
where('id''[0-9]+');

Передача массива PHPwhere-ограничений

Конечно, при необходимости вы можете передать массив ограничений (constraints):

PHP
Route::get('user/{id}/{name}', function ($id$name) {
  
//
})
->
where(array('id' => '[0-9]+''name' => '[a-z]+'));

Регистрация глобальных шаблонов

Если вы хотите, чтобы параметр был всегда ограничен заданным регулярным выражением, то можете использовать метод pattern:

PHP
Route::pattern('id''[0-9]+');

Route::get('user/{id}', function($id)
{
  
// Вызывается только если {id} числовой.
});
+ 4.1

добавлено в 4.1 ()

Доступ к значению параметра маршрута

Если вам нужен доступ к значению параметра маршрута извне, то вы можете использовать метод PHPRoute::input():

PHP
Route::filter('foo', function()
{
  if (
Route::input('id') == 1)
  {
    
//
  
}
});

Фильтры маршрутов

Фильтры — удобный механизм ограничения доступа к определённому маршруту, что полезно при создании областей сайта только для авторизованных пользователей. В Laravel изначально включено несколько фильтров, в том числе auth, auth.basic, guest и csrf. Они определены в файле app/filters.php.

Регистрация фильтра маршрутов

PHP
Route::filter('old', function () {
  if (
Input::get('age') < 200) {
    return 
Redirect::to('home');
  }
});

Если фильтр возвращает значение, оно используется как ответ на сам запрос и обработчик маршрута не будет вызван, и все after-фильтры тоже будут пропущены.

Привязка фильтра к маршруту

PHP
Route::get('user', array('before' => 'old', function () {
  return 
'Вам больше 200 лет!';
}));

Привязка фильтра к действию контроллера

PHP
Route::get('user', array('before' => 'old''uses' => 'UserController@showProfile'));

Привязка нескольких фильтров к маршруту

PHP
Route::get('user', array('before' => 'auth|old', function () {
  return 
'Вы авторизованы и вам больше 200 лет!';
}));
+ 4.1

добавлено в 4.1 ()

Привязка нескольких фильтров в виде массива

PHP
Route::get('user', array('before' => array('auth''old'), function()
{
  return 
'Вы авторизованы и вам больше 200 лет!';
}));

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

PHP
Route::filter('age', function ($route$request$value) {
  
//
});

Route::get('user', array('before' => 'age:200', function () {
  return 
'Привет, мир!';
}));

Фильтры типа after (выполняющиеся после запроса, если он не был отменён фильтром beforeприм. пер.) получают PHP$response как свой третий аргумент:

PHP
Route::filter('log', function ($route$request$response) {
  
//
});

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

Вы можете также указать, что фильтр применяется ко всем маршрутам, URI (путь) которых соответствует шаблону.

PHP
Route::filter('admin', function () {
  
//
});

Route::when('admin/*''admin');

В примере выше фильтр admin будет применён ко всем маршрутам, адрес которых начинается с admin/. Звёздочка (*) используется как символ подстановки и соответствует любому набору символов, в том числе пустой строке.

Вы также можете привязывать фильтры, зависящие от типа HTTP-запроса:

PHP
Route::when('admin/*''admin', array('post'));

Классы фильтров

Для продвинутой фильтрации вы можете использовать классы вместо замыканий. Так как фильтры создаются с помощью IoC-контейнера, то вы можете положиться на его внедрение зависимостей для лучшего тестирования.

+ 4.1

добавлено в 4.1 ()

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

PHP
Route::filter('foo''FooFilter');

По умолчанию будет вызван метод PHPfilter() на класс PHPFooFilter:

PHP
class FooFilter {

    public function 
filter()
    {
        
// Код логики фильтра...
    
}

}

Если вы не хотите использовать метод PHPfilter(), просто укажите другой метод:

PHP
Route::filter('foo''FooFilter@foo');

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

Присваивая имена маршрутам вы можете сделать обращение к ним (при генерации URL или переадресациях) более удобным. Вы можете задать имя маршруту таким образом:

PHP
Route::get('user/profile', array('as' => 'profile', function () {
  
//
}));

Также можно указать контроллер и его действие:

PHP
Route::get('user/profile', array('as' => 'profile',
                                 
'uses' => 'UserController@showProfile'));

Теперь вы можете использовать имя маршрута при генерации URL или переадресации:

PHP
$url URL::route('profile');

$redirect Redirect::route('profile');

Получить имя текущего выполняемого маршрута можно методом PHPcurrentRouteName():

PHP
$name Route::currentRouteName();

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

Иногда вам может быть нужно применить фильтры к набору маршрутов. Вместо того, чтобы указывать их для каждого маршрута в отдельности вы можете сгруппировать маршруты:

PHP
Route::group(array('before' => 'auth'), function () {
  
Route::get('/', function () {
    
// К этому маршруту привязан фильтр auth.
  
});

  
Route::get('user/profile', function () {
    
// К этому маршруту также привязан фильтр auth.
  
});
});
+ 4.1

добавлено в 4.1 ()

Вы также можете использовать параметр PHPnamespace для вашего массива PHPgroup, чтобы указать, что все контроллеры этой группы находятся в данном пространстве имен:

PHP
Route::group(array('namespace' => 'Admin'), function()
{
  
//
});

Доменная маршрутизация

Маршруты Laravel способны работать и с поддоменами по их маске и передавать в ваш обработчик параметры из шаблона.

Регистрация маршрута по поддомену

PHP
Route::group(array('domain' => '{account}.myapp.com'), function () {

  
Route::get('user/{id}', function ($account$id) {
    
//
  
});

});

Префикс пути

Группа маршрутов может быть зарегистрирована с одним префиксом без его явного указания с помощью ключа prefix в параметрах группы:

PHP
Route::group(array('prefix' => 'admin'), function () {

  
Route::get('user', function () {
    
//
  
});

});

Привязка моделей

Привязка моделей — удобный способ передачи экземпляров моделей в ваш маршрут. Например, вместо передачи ID пользователя вы можете передать модель PHPUser, которая соответствует данному ID, целиком. Для начала используйте метод PHPRoute::model() для указания модели, которая должна быть использована вместо данного параметра.

Привязка параметра к модели

PHP
Route::model('user''User');

Затем зарегистрируйте маршрут, который принимает параметр {user}:

PHP
Route::get('profile/{user}', function (User $user) {
  
//
});

Из-за того, что мы ранее привязали параметр {user} к модели PHPUser, то её экземпляр будет передан в маршрут. Таким образом, к примеру, запрос profile/1 передаст объект PHPUser, который соответствует ID 1 (полученному из БД — прим. пер.).

Внимание: если переданный ID не соответствует строке в БД будет возбуждено исключение 404.

Если вы хотите задать свой собственный обработчик для события «не найдено», вы можете передать функцию-замыкание в метод PHPmodel():

PHP
Route::model('user''User', function () {
  throw new 
NotFoundHttpException;
});

Иногда вам может быть нужно использовать собственный метод для получения модели перед её передачей в маршрут. В этом случае просто используйте метод PHPRoute::bind():

PHP
Route::bind('user', function ($value$route) {
  return 
User::where('name'$value)->first();
});

Ошибки 404

Есть два способа вызвать исключение 404 (Not Found) из маршрута. Первый — методом PHPApp::abort():

PHP
App::abort(404);

Второй — возбудив исключение класса или потомка класса PHPSymfony\Component\HttpKernel\Exception\NotFoundHttpException.

Больше информации о том, как обрабатывать исключения 404 и отправлять собственный ответ на такой запрос содержится в разделе об ошибках.

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

Laravel позволяет вам регистрировать маршруты не только в виде функции-замыкания, но и классов-контроллеров и даже создавать контроллеры ресурсов.

Больше информации содержится в разделе о контроллерах.

Комментарии (5)

Russell

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException

Proger_XP

Вы создали POST-маршрут, но наверняка пытаетесь его открыть через браузер просто как GET. Для этого надо создать отдельный GET-маршрут или использовать PHPany().

А вообще вопросы лучше задавать на форуме.

Rusl

Здравствуйте. Подскажите пожалуйста, почему у меня не работает обработка POST — запроса (из формы)?
Вот весь файл routes.php:

PHP
<?php
Route
::get('/', function()
{
    return 
"Hello!";
});

Route::get('test''MyFirstController@test'); //Вызывается представление с формой

Route::post('test/act_form', function() //Пробовал так же просто "act_form" - не работает
{
  return 
"Форма обработана!";
});
Proger_XP

Вам стоит задавать вопросы на форуме.

Dmitro

liss.esy.es есть сайт , при наборе в адресной строке попадаете, на index.php, как прописать чтобы при наборе liss.esy.es/редактор попадало на редактор.php . Оба файла и index.php и редактор.php находятся в public папке. Можна задать liss.esy.es/редактор.php но хотелось бы liss.esy.es/редактор подскажите пожалуйста как или где мозга почитать. 62500@ukr.net. спасибо

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

Разметка: ? ?

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