Урок 11. Обработка, параметры и методы в маршрутах Laravel


Все уроки по Laravel расположены здесь

Методы в маршрутах

Возможно, вы заметили, что мы используем Route::get() в наших определениях маршрутов. Это означает, что мы говорим Laravel, чтобы он соответствовал только этим маршрутам, когда HTTP-запрос использует действие GET. Но что, если это сообщение формы или, может быть, какой-то JavaScript, отправляющий запросы PUT или DELETE? Существует несколько других вариантов вызова методов для определения маршрута, как показано в коде ниже:

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

Route::post('/', function () {
    // Какой-то обработчик этого урла, если идет на POST-запрос
});

Route::put('/', function () {
    // Какой-то обработчик этого урла, если идет на PUT-запрос
});

Route::delete('/', function () {
    // Какой-то обработчик этого урла, если идет на DELETE-запрос
});

Route::any('/', function () {
    // Обработчик всех типов запросов
});

Route::match(['get', 'post'], '/', function () {
    // Обработчик GET или POST запросов этого роута
});
Обработка маршрута

Как вы, наверное, уже догадались, передача замыкания в определение маршрута - это не единственный способ научить его разрешать маршрут. Замыкания быстры и просты, но чем больше ваше приложение становится, тем более неуклюжим становится решение поместить всю вашу логику маршрутизации в один файл. Кроме того, приложения, использующие закрытие маршрутов, не могут воспользоваться преимуществами кэширования маршрутов Laravel (подробнее об этом позже), которое может сократить время выполнения каждого запроса до сотен миллисекунд.

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

Route::get('/', 'WelcomeController@index');
Этот код говорит Laravel передавать запросы по этому пути в метод index() контроллера App\Http\Controllers\WelcomeController. Этот метод будет передан те же параметры и обработан так же, как закрытие, которое вы могли бы альтернативно поставить на его место.

Синтаксис ссылки на контроллер/метод laravel

В Laravel есть соглашение о том, как ссылаться на конкретный метод в данном контроллере: controllerName@methodName. Laravel анализирует то, что находится до и после @, и использует эти сегменты для идентификации контроллера и метода. В Laravel 5.7 также был введен синтаксис “кортежа” (Route::get('/', [WelcomeController::class, 'index'])), но по-прежнему часто используется controllerName@methodName для описания метода.

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

Если маршрут, который вы определяете, имеет параметры — сегменты в структуре URL, которые являются переменными, — их просто определить в вашем маршруте и передать в ваше замыкание

Route::get('users/{id}/friends', function ($id) {
    //
});
Вы также можете сделать параметры маршрута необязательными, включив вопросительный знак (?) после имени параметра, как показано в коде ниже. В этом случае вы также должны указать значение по умолчанию для соответствующей переменной маршрута.

Route::get('users/{id?}', function ($id = 'fallbackId') {
    //
});
И вы можете использовать регулярные выражения (regexes), чтобы определить, что маршрут должен совпадать только в том случае, если параметр отвечает определенным требованиям.

Ограничения маршрута регулярным выражением

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

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

Route::get('posts/{id}/{slug}', function ($id, $slug) {
    //
})->where(['id' => '[0-9]+', 'slug' => '[A-Za-z]+']);
Как вы, вероятно, уже догадались, если вы посещаете путь, который соответствует строке маршрута, но регулярное выражение не соответствует параметру, оно не будет сопоставлено. Поскольку маршруты сопоставляются сверху вниз, пользователи/abc пропустят первое замыкание в примере выше, но оно будет сопоставлено со вторым закрытием, поэтому оно будет перенаправлено туда. С другой стороны, posts/abc/123 не будет соответствовать ни одному из замыканий, поэтому он вернет ошибку 404 (Не найден).

Связь именования между параметрами маршрута и параметры метода закрытия/контроллера

Как вы можете видеть, чаще всего используются одни и те же имена для параметров маршрута ({id}) и параметров метода, которые они вводят в определение маршрута (функция ($id)). Но так ли это необходимо?

Если вы не используете привязку модели маршрута, нет. Единственное, что определяет, какой параметр маршрута совпадает с каким параметром метода, - это их порядок (слева направо), как вы можете видеть здесь:

Route::get('users/{userId}/comments/{commentId}', function (
    $thisIsActuallyTheUserId,
    $thisIsReallyTheCommentId
    ) {
    //
}); 
Как уже было сказано, только потому, что вы можете сделать их разными, не означает, что вы должны. Я рекомендую сохранить их прежними ради будущих разработчиков, которые могут споткнуться из-за непоследовательного именования.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, уроки по Laravel, маршрутизация, php




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Урок 20. Метод toString() Java
Поля и методы в Java: рекурсия и стек вызовов метода
Обновляем файловую систему с помощью diff и patch