Простейшая маршрутизация
Большинство маршрутов (routes) вашего приложения будут определены в файле app/routes.php. В Laravel, простейший маршрут состоит из URI (пути) и функции-замыкания.
Route::get('/', function () {
return 'Hello World';
});
Route::post('foo/bar', function () {
return 'Hello World';
});
добавлено в 4.1 ()
Регистрация маршрута для любого типа HTTP-запроса
Route::any('foo', function () {
return 'Hello World';
});
Регистрация маршрута, всегда работающего через HTTPS
Route::get('foo', array('https', function() {
return 'Must be over HTTPS';
}));
Вам часто может понадобиться сгенерировать URL к какому-либо маршруту — для этого используется метод PHPURL::to()
:
$url = URL::to('foo');
Параметры маршрутов
Route::get('user/{id}', function ($id) {
return 'User '.$id;
});
Необязательные параметры маршрута
Route::get('user/{name?}', function ($name = null) {
return $name;
});
Необязательные параметры со значением по умолчанию
Route::get('user/{name?}', function ($name = 'John') {
return $name;
});
Маршруты с соответствием пути регулярному выражению
Route::get('user/{name}', function ($name) {
//
})
->where('name', '[A-Za-z]+');
Route::get('user/{id}', function ($id) {
//
})
->where('id', '[0-9]+');
Передача массива PHPwhere
-ограничений
Конечно, при необходимости вы можете передать массив ограничений (constraints):
Route::get('user/{id}/{name}', function ($id, $name) {
//
})
->where(array('id' => '[0-9]+', 'name' => '[a-z]+'));
Регистрация глобальных шаблонов
Если вы хотите, чтобы параметр был всегда ограничен заданным регулярным выражением, то можете использовать метод pattern:
Route::pattern('id', '[0-9]+');
Route::get('user/{id}', function($id)
{
// Вызывается только если {id} числовой.
});
добавлено в 4.1 ()
Фильтры маршрутов
Фильтры — удобный механизм ограничения доступа к определённому маршруту, что полезно при создании областей сайта только для авторизованных пользователей. В Laravel изначально включено несколько фильтров, в том числе auth, auth.basic, guest и csrf. Они определены в файле app/filters.php.
Route::filter('old', function () {
if (Input::get('age') < 200) {
return Redirect::to('home');
}
});
Если фильтр возвращает значение, оно используется как ответ на сам запрос и обработчик маршрута не будет вызван, и все after-фильтры тоже будут пропущены.
Route::get('user', array('before' => 'old', function () {
return 'Вам больше 200 лет!';
}));
Привязка фильтра к действию контроллера
Route::get('user', array('before' => 'old', 'uses' => 'UserController@showProfile'));
Привязка нескольких фильтров к маршруту
Route::get('user', array('before' => 'auth|old', function () {
return 'Вы авторизованы и вам больше 200 лет!';
}));
добавлено в 4.1 ()
Передача параметров для фильтра
Route::filter('age', function ($route, $request, $value) {
//
});
Route::get('user', array('before' => 'age:200', function () {
return 'Привет, мир!';
}));
Фильтры типа after (выполняющиеся после запроса, если он не был отменён фильтром before — прим. пер.) получают PHP$response
как свой третий аргумент:
Route::filter('log', function ($route, $request, $response) {
//
});
Фильтры по шаблону
Вы можете также указать, что фильтр применяется ко всем маршрутам, URI (путь) которых соответствует шаблону.
Route::filter('admin', function () {
//
});
Route::when('admin/*', 'admin');
В примере выше фильтр admin будет применён ко всем маршрутам, адрес которых начинается с admin/. Звёздочка (*) используется как символ подстановки и соответствует любому набору символов, в том числе пустой строке.
Вы также можете привязывать фильтры, зависящие от типа HTTP-запроса:
Route::when('admin/*', 'admin', array('post'));
Классы фильтров
Для продвинутой фильтрации вы можете использовать классы вместо замыканий. Так как фильтры создаются с помощью IoC-контейнера, то вы можете положиться на его внедрение зависимостей для лучшего тестирования.
добавлено в 4.1 ()
Route::filter('foo', 'FooFilter');
По умолчанию будет вызван метод PHPfilter()
на класс PHPFooFilter
:
class FooFilter {
public function filter()
{
// Код логики фильтра...
}
}
Если вы не хотите использовать метод PHPfilter()
, просто укажите другой метод:
Route::filter('foo', 'FooFilter@foo');
Именованные маршруты
Присваивая имена маршрутам вы можете сделать обращение к ним (при генерации URL или переадресациях) более удобным. Вы можете задать имя маршруту таким образом:
Route::get('user/profile', array('as' => 'profile', function () {
//
}));
Также можно указать контроллер и его действие:
Route::get('user/profile', array('as' => 'profile',
'uses' => 'UserController@showProfile'));
Теперь вы можете использовать имя маршрута при генерации URL или переадресации:
$url = URL::route('profile');
$redirect = Redirect::route('profile');
Получить имя текущего выполняемого маршрута можно методом PHPcurrentRouteName()
:
$name = Route::currentRouteName();
Группы маршрутов
Иногда вам может быть нужно применить фильтры к набору маршрутов. Вместо того, чтобы указывать их для каждого маршрута в отдельности вы можете сгруппировать маршруты:
Route::group(array('before' => 'auth'), function () {
Route::get('/', function () {
// К этому маршруту привязан фильтр auth.
});
Route::get('user/profile', function () {
// К этому маршруту также привязан фильтр auth.
});
});
добавлено в 4.1 ()
Доменная маршрутизация
Маршруты Laravel способны работать и с поддоменами по их маске и передавать в ваш обработчик параметры из шаблона.
Регистрация маршрута по поддомену
Route::group(array('domain' => '{account}.myapp.com'), function () {
Route::get('user/{id}', function ($account, $id) {
//
});
});
Префикс пути
Группа маршрутов может быть зарегистрирована с одним префиксом без его явного указания с помощью ключа prefix в параметрах группы:
Route::group(array('prefix' => 'admin'), function () {
Route::get('user', function () {
//
});
});
Привязка моделей
Привязка моделей — удобный способ передачи экземпляров моделей в ваш маршрут. Например, вместо передачи ID пользователя вы можете передать модель PHPUser
, которая соответствует данному ID, целиком. Для начала используйте метод PHPRoute::model()
для указания модели, которая должна быть использована вместо данного параметра.
Route::model('user', 'User');
Затем зарегистрируйте маршрут, который принимает параметр {user}:
Route::get('profile/{user}', function (User $user) {
//
});
Из-за того, что мы ранее привязали параметр {user} к модели PHPUser
, то её экземпляр будет передан в маршрут. Таким образом, к примеру, запрос profile/1 передаст объект PHPUser
, который соответствует ID 1 (полученному из БД — прим. пер.).
Внимание: если переданный ID не соответствует строке в БД будет возбуждено исключение 404.
Если вы хотите задать свой собственный обработчик для события «не найдено», вы можете передать функцию-замыкание в метод PHPmodel()
:
Route::model('user', 'User', function () {
throw new NotFoundHttpException;
});
Иногда вам может быть нужно использовать собственный метод для получения модели перед её передачей в маршрут. В этом случае просто используйте метод PHPRoute::bind()
:
Route::bind('user', function ($value, $route) {
return User::where('name', $value)->first();
});
Ошибки 404
Есть два способа вызвать исключение 404 (Not Found) из маршрута. Первый — методом PHPApp::abort()
:
App::abort(404);
Второй — возбудив исключение класса или потомка класса PHPSymfony\Component\HttpKernel\Exception\NotFoundHttpException
.
Больше информации о том, как обрабатывать исключения 404 и отправлять собственный ответ на такой запрос содержится в разделе об ошибках.
Маршрутизация в контроллер
Laravel позволяет вам регистрировать маршруты не только в виде функции-замыкания, но и классов-контроллеров и даже создавать контроллеры ресурсов.
Больше информации содержится в разделе о контроллерах.
Комментарии (5)
Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException
Вы создали POST-маршрут, но наверняка пытаетесь его открыть через браузер просто как GET. Для этого надо создать отдельный GET-маршрут или использовать
PHPany()
.А вообще вопросы лучше задавать на форуме.
Здравствуйте. Подскажите пожалуйста, почему у меня не работает обработка POST — запроса (из формы)?
Вот весь файл routes.php:
<?php
Route::get('/', function()
{
return "Hello!";
});
Route::get('test', 'MyFirstController@test'); //Вызывается представление с формой
Route::post('test/act_form', function() //Пробовал так же просто "act_form" - не работает
{
return "Форма обработана!";
});
Вам стоит задавать вопросы на форуме.
liss.esy.es есть сайт , при наборе в адресной строке попадаете, на index.php, как прописать чтобы при наборе liss.esy.es/редактор попадало на редактор.php . Оба файла и index.php и редактор.php находятся в public папке. Можна задать liss.esy.es/редактор.php но хотелось бы liss.esy.es/редактор подскажите пожалуйста как или где мозга почитать. 62500@ukr.net. спасибо