Laravel 5.4 Устанавливает Все Маршруты Аутентификации, Кроме Маршрута Выхода Из Системы, Используя Пользовательский Маршрут Выхода/Контроллер


Так что по какой-то причине я думал, что уже сталкивался с ответом на этот вопрос, но, хоть убей, я не могу найти ответ снова, ни через Google, ни через StackOverflow. Это может быть просто вопрос о резиновой утке, и я сожалею, если это так, но я надеюсь, что этот вопрос когда-нибудь будет полезен кому-то с этой же проблемой.

Давайте предположим, что мы начинаем с новой установки Laravel 5.4. Я запускаю команду php artisan make:auth в своем терминале, и она настраивает аутентификацию Строительные леса для меня. Теперь в моем/routes/web.php файл Я вижу следующую строку:

Auth::routes();

Что потрясающе, и в списке маршрутов перечислены все маршруты аутентификации, включая определенный маршрут выхода. (Набрано php artisan r:l для двойной проверки) Теперь я хочу задать пользовательский маршрут выхода для пользователя с помощью пользовательского контроллера выхода. Теперь я подумал, что есть метод, который вы могли бы связать с группой маршрутов ресурсов под названием "кроме()", но, клянусь жизнью, я не могу найти ни одного информация об этом методе содержится в документации. Я даже не знаю, существует ли этот метод, не говоря уже о том, чтобы знать, как его передать.

Я предполагаю, что поколение Auth::routes() может использовать метод except, как в маршруте ресурсов, но я не совсем уверен, как его реализовать?

Итак, вопрос прост. Как включить все маршруты аутентификации, кроме маршрута выхода, а затем я определю маршрут выхода, используя следующую строку.

Route::get('logout', 'LogoutController@userLogout')->name('logout');

Извините, если это дублирующая запись, я использовал строку поиска в течение последнего часа, и ничто не отвечает на мой вопрос.

Редактировать: Я провел больше исследований маршрутов ресурсов и понял, что это не метод, который я привязываю к маршруту, а скорее массив с парой значений ключа. Смотрите код ниже (вырван из документов laravel).

Route::resource('photo', 'PhotoController', ['except' => [
    'create', 'store', 'update', 'destroy'
]]);

Однако, когда я передаю массив в метод routes() (см. Код ниже), маршрут выхода все еще присутствует в списке маршрутов. Однако на php artisan r:l не выводится ошибка команда.

// User Authentication Routes
Auth::routes(['except' => 'logout']);

РЕДАКТИРОВАТЬ: После долгих поисков кажется, что выполнить этот тип функций невозможно. Я отправил проблему в репозиторий github laravel/framework с просьбой добавить эту функцию в 5.5.

Исключить маршрут из проверки подлинности Laravel

Https://github.com/laravel/framework/issues/20904

Author: J. Robinson, 2017-09-01

1 answers

Робинсон, спасибо за обращение ко мне в Твиттере за помощью в этом ответе. Я действительно думаю, что это отличный вопрос, и надеюсь, что этот вопрос поднимется в рейтинге Google, чтобы будущие разработчики могли его найти и, возможно, вызвать небольшую дискуссию в сообществе.

Как я могу предотвратить создание маршрута выхода с помощью команды Auth::routes()?

Короче говоря... вы не можете. Если вы хотите использовать стенографию Auth::routes(), то это команда типа "все или ничего" . Вы можете просмотреть фактический исходный код этой команды здесь для Laravel v5.5 (хотя, я полагаю, он не изменился с версии 5.2), и, просматривая фактический код команды стенографии, вы можете увидеть, что он не принимает никаких параметров, таких как массив ['except' => 'logout'], который вы ожидали с другими вспомогательными командами маршрута в Laravel. Здесь нет скрытых, недокументированных секретов, чтобы заставить эту команду делать что-то уникальное, проверяя исходный код мы видим, что он не настроен на что-либо, кроме возврата предварительно заданного списка маршрутов.

Он буквально просто выводит набор маршрутов без какой-либо логики (принятия решений) вообще. Эта команда - просто сокращенный метод, который избавляет вас от необходимости самостоятельно писать все эти маршруты.

С учетом сказанного, нет никаких причин, по которым вы ДОЛЖНЫ использовать эту стенографию. Вы можете вручную составить все эти маршруты самостоятельно. Посмотрите на исходный код, который я связал выше, или запустите php artisan r:l (еще одно сокращение для route:list для любых нубов, читающих это) и скопируйте тот же вывод в файл маршрутов. Это позволяет вам пропускать или изменять любые маршруты по своему вкусу.

Вот как будут выглядеть маршруты, если вы захотите добавить их без команды стенографии. Обязательно удалите эту команду и вставьте их вместо нее. Какие бы команды вы ни хотели удалить или изменить, их можно легко выполнить, как и любой другой маршрут. Я взял это из исходного кода Laravel, так что это 100% В ТОЧНОСТИ то же самое, что создает команда стенографии, включая порядок маршрутов (и технически комментарии тоже).

// Authentication Routes...
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');

// Registration Routes...
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
Route::post('register', 'Auth\RegisterController@register');

// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');

Поэтому, если вы захотите скопировать этот блок кода и добавить его в файл маршрутов, он даст вам те же результаты (и сделает то же самое за кулисами), что и команда shorthand Auth::routes(). Теперь вы можете настроить или удалить любую из команд, которые вы хотите.

Как изменить маршрут выхода из системы на маршрут GET?

Итак теперь, когда мы обсудили, как вы работаете с маршрутами проверки подлинности, давайте ответим на вопрос о мясе и картофеле, стоящий за вашим вопросом. Вы хотите сделать команду выхода доступной с помощью запроса GET (в отличие от запроса POST, который Laravel устанавливает по умолчанию.

Достаточно просто, есть два способа сделать это:

1) Скопируйте все маршруты и измените маршрут выхода на запрос GET

Это достаточно просто, удалите стенографию Auth::routes(), а затем скопируйте маршруты, которые я опубликовал выше, и вставьте их в свой файл маршрутов в том же месте, где раньше был ваш Auth::routes(). Затем на третьем маршруте наших новых маршрутов аутентификации мы находим выход из системы. Просто измените его с Route::post() на Route::get() и оставьте все остальное прежним.

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

// Authentication Routes...
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::get('logout', 'Auth\LoginController@logout')->name('logout');

// Registration Routes...
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
Route::post('register', 'Auth\RegisterController@register');

// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');

2) Второй вариант - добавить версию GET в дополнение к вашей Auth::routes() стенография.

Это в конечном итоге сделало бы маршрут выхода доступным как по запросу GET, так и по запросу POST. Они оба ссылаются на один и тот же метод, поэтому они делают одно и то же и работают одинаково, и теперь вы можете выйти из системы либо по запросу POST, либо по запросу GET.

Результирующий код этой опции будет следующим:

Auth::routes();
Route::get('logout', 'Auth\LoginController@logout');

Обратите внимание, что я опустил имя во второй строке. Он уже назван благодаря команде Auth::routes(). Так что вам не нужно называть это снова. Имя logout хотя все равно будет работать. Таким образом, вы все еще можете использовать <a href="{{ route('logout') }}">Logout</a> в своих блейд-файлах, и имя маршрута будет работать независимо от того, используете ли вы его в качестве запроса GET или POST.

Итак, вы отправляетесь в долгое извилистое путешествие в мир Auth::routes() стенографической команды.

 10
Author: jacurtis, 2017-09-01 01:21:49