git d85007e94210beae6413fee9f5e951d14eff219f
- Базовый роутинг
- Параметры роутинга
- именованные роуты
- Группы роутов
- Префиксы роутов
- защита от CSRF
- Подмена методов (Method Spoofing)
- Отображение ошибок 404
Вы будете задавать большинство роутов для своего приложения в файле app/Http/routes.php
, который по умолчанию загружается в файле bootstrap/app.php
. Как и Laravel, большинство основных роутов Lumen принимают URI и Closure
(Замыкания):
$app->get('/', function() {
return 'Hello World';
});
$app->post('foo/bar', function() {
return 'Hello World';
});
$app->patch('foo/bar', function() {
//
});
$app->put('foo/bar', function() {
//
});
$app->delete('foo/bar', function() {
//
});
Часто вам будет необходимо генерировать URL'ы к вашим роутам. Вы это можете сделать с помощью хэлпера url
:
$url = url('foo');
Если вы заинтересованы в запросах роутов в классам, прочитайте документацию о контроллерах.
Конечно же, вы можете получать сегменты запрашиваемого URI в вашем роуте:
$app->get('user/{id}', function($id) {
return 'User '.$id;
});
Внимание: Это единственная чать Lumen, которую невозможно напрямую скопировать в Laravel. Если вы решите обновить ваше приложение на Lumen в приложение на Laravel, то эти регулярные выражения должны быть перемещены в вызов метода
where
в роуте.
$app->get('user/{name:[A-Za-z]+}', function($name) {
//
});
именованные роуты позволяют вам удобным споссобом генерировать URL'ы или перенаправлять к определенным роутам. Вы можете задать имя для роута с помощью ключа массива as
:
$app->get('user/profile', ['as' => 'profile', function() {
//
}]);
Вы, так же можете задать имя роута для метода контроллера:
$app->get('user/profile', [
'as' => 'profile', 'uses' => 'App\Http\Controllers\UserController@showProfile'
]);
Теперь вы можете использовать название роута при генерации URL'ов или редиректе:
$url = route('profile');
$redirect = redirect()->route('profile');
Иногда вам может потребоваться применить middleware к группе роутов. Вместо того, чтобы указывать middleware для каждого роута, вы можете использовать группу роутов.
Общие аттрибуты указываются в виде массива в первом параметре метода $app->group()
.
Middleware применяется ко всем роутам внитри группы, если передавать массив аттрибутов группы роутов с ключом middleware
и списком нужных middleware. Middleware будут применены в порядке, указанном вами в массиве:
$app->group(['middleware' => 'foo|bar'], function($app)
{
$app->get('/', function() {
// Использует Foo и Bar Middleware
});
$app->get('user/profile', function() {
// Использует Foo и Bar Middleware
});
});
Вы можете использовать параметр namespace
в массиве атрибутов группы, чтобы указать пространство имен для всех контроллеров внутри группы:
$app->group(['namespace' => 'App\Http\Controllers\Admin'], function($app) {
// Контроллеры в пространстве имен "App\Http\Controllers\Admin"
});
Группа роутов может иметь префикс, указываемый с помощью аттрибута prefix
для группы:
$app->group(['prefix' => 'admin'], function()
{
$app->get('users', function()
{
// Соответствует УРЛу "/admin/users"
});
});
Вы, так же, можете использовать параметр prefix
для передачи общих параметров в ваш роут:
$app->group(['prefix' => 'accounts/{account_id}'], function()
{
$app->get('detail', function($account_id)
{
//
});
});
Внимание: Вам необходимо активировать сессии чтобы иметь воспользоваться этой возможностью Lumen.
Lumen, как и Laravel, позволяет легко защитить ваше приложение от межсайтовой подделки запросов (CSRF). CSRF - это один из видов вредоносного использования команд неавторизованным пользователем, от имени авторизованного.
Lumen автоматически генерирует CSRF-ключ для каждой активной пользовательской сессии, используемой в приложении. Этот ключ позволяет убедиться в том, что только авторизованный пользователь делает эти запросы к приложению.
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
И конечно же, используя шаблонизатор Blade:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
Нет необходимости вручную проверять CSRF-ключ при запросах POST, PUT, или DELETE. Если это активировано в файле bootstrap/app.php
, то Laravel\Lumen\Http\Middleware\VerifyCsrfToken
посредник сам проверит то, что ключ пришедший в запросе, и хранящийся в сессии - один и тот же.
В дополнение к проверке CSRF-ключа, как параметра "POST", посредник, так же будет проверять параметр заголовка запроса X-CSRF-TOKEN
. Вы можете, например, указывать ключ в мета-тегах и добавлять его в заголовки при использовании jQuery:
<meta name="csrf-token" content="{{ csrf_token() }}" />
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
Теперь все запросы AJAX будут автоматически включать в себя CSRF-ключ:
$.ajax({
url: "/foo/bar",
})
Lumen, также хранит CSRF-ключ в куки XSRF-TOKEN
. Вы можете использовать значение в куки, чтобы задать заголовок запроса X-XSRF-TOKEN
. Некоторые Javascript-фреймворки, такие как Angular, делают это автоматичеки.
Замечание: Разница между
X-CSRF-TOKEN
иX-XSRF-TOKEN
в том, что первый использует простое текстовое значение, а второй использует зашифроавнное значение, так как куки в Lumen всегда зашифрованы, когда активированы глобальные посредники в файлеbootstrap/app.php
.
HTML формы не поддерживают отправку с помощью методов PUT
, PATCH
или DELETE
. Таким образом, при использовании роутов PUT
, PATCH
, либо DELETE
вызываемых из HTML-формы, вам необходимо добавлять скрытое поле с именем _method
к форме.
Значение, отправленное в поле с именем _method
, будет использовано как метод отправки запроса. Например:
<form action="/foo/bar" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
Есть 2 способа вручную выбросить исключение 404 из роута. Во-первых, вы можете использовать хэлпер abort
:
abort(404);
Хэлпер abort
, просто выбрасывает исключение Symfony\Component\HttpFoundation\Exception\HttpException
с нужным кодом статуса.
Во-вторых, вы можете вручную выбросить экземпляр исключения Symfony\Component\HttpKernel\Exception\NotFoundHttpException
.
Больше информации по применению исключений 404 и использованию собственных ответов на эти ошибки можно найти в документации в разделе ошибок.