Php Laravel 5.4设置除注销路由之外的所有身份验证路由-使用自定义注销路由/控制器

Php Laravel 5.4设置除注销路由之外的所有身份验证路由-使用自定义注销路由/控制器,php,laravel,authentication,laravel-5,routes,Php,Laravel,Authentication,Laravel 5,Routes,因此,出于某种原因,我认为我以前找到了这个问题的答案,但就我的一生而言,我再也找不到答案了,无论是通过谷歌还是StackOverflow。这可能只是一个橡皮鸭问题,如果是的话,我很抱歉,但我希望这个问题有一天会对有同样问题的人有所帮助 假设我们从新安装的Laravel 5.4开始。我在终端中运行phpartisanmake:auth命令,它为我设置了身份验证框架。现在,在我的/routes/web.php文件中,我看到了以下一行: Auth::routes() 这太棒了,路由列表中列出了所有身份

因此,出于某种原因,我认为我以前找到了这个问题的答案,但就我的一生而言,我再也找不到答案了,无论是通过谷歌还是StackOverflow。这可能只是一个橡皮鸭问题,如果是的话,我很抱歉,但我希望这个问题有一天会对有同样问题的人有所帮助

假设我们从新安装的Laravel 5.4开始。我在终端中运行
phpartisanmake:auth
命令,它为我设置了身份验证框架。现在,在我的/routes/web.php文件中,我看到了以下一行:

Auth::routes()

这太棒了,路由列表中列出了所有身份验证路由,包括定义的注销路由。(键入
php artisan r:l
进行双重检查)现在我想使用自定义注销控制器为用户设置自定义注销路径。现在,我认为有一种方法可以链接到一组名为“except()”的资源路由上,但就我而言,我在文档中找不到任何关于此方法的信息。我不知道这个方法是否存在,更不用说知道该传递什么了

我假设
Auth::routes()
生成可以像在资源路由中一样使用except方法,但我不完全确定如何实现它

所以问题很简单。如何包括除注销路由之外的所有身份验证路由,然后我将使用以下行定义注销路由

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

对不起,如果这是一个重复的条目,我已经使用搜索栏在过去的一个小时,没有回答我的问题

编辑:我对资源路由做了更多的研究,并意识到这不是一种链接到路由上的方法,而是一个带有键值对的数组。参见下面的代码(摘自laravel文档)

但是,当我将数组传递到
routes()
方法(请参见下面的代码)时,注销路由仍在路由列表中。但是,
php artisan r:l
命令没有引发任何错误

// User Authentication Routes
Auth::routes(['except' => 'logout']);
编辑:经过反复挖掘,似乎不可能实现这种功能。我已经向laravel/framework github repo提交了一个问题,请求在5.5中添加该功能


在Laravel 6.x中,某些身份验证路由已更改。您可以使用以下代码行排除寄存器路由

Auth::routes(['register'=>false])

但是,由于您要求注册路由保持不变,因此您必须按照回答此问题的其他人所做的操作,手动定义所有路由。然而,他们的答案还没有更新到Laravel的当前版本。下面是从6.x版开始的所有路线的更新列表

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

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

// User 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')->name('password.update');

// User Verification Routes
Route::get('email/verify', 'Auth\VerificationController@show')->name('verification.notice');
Route::get('email/verify/{id}/{hash}', 'Auth\VerificationController@verify')->name('verification.verify');
Route::post('email/resend', 'Auth\VerificationController@resend')->name('verification.resend');
罗宾逊,谢谢你对这个答案的帮助。事实上,我认为这是一个很好的问题,希望这个问题能在谷歌的排名中得到提升,让未来的开发者能够找到它,并在社区中引发一些讨论

如何防止使用
Auth::routes()
命令生成注销路由? 长话短说你不能。如果你想使用
Auth::routes()
速记,那么它是一个全有或全无类型的命令。(尽管我相信它自5.2版以来没有改变),并且查看速记命令背后的实际代码,您可以看到它不接受任何参数,例如您期望在Laravel中使用其他route helper命令时使用的
['except'=>'logout']
数组。这里没有隐藏的、未记录的秘密来让这个命令做任何独特的事情,通过检查源代码,我们可以看到它除了返回一个预设的路由列表之外没有其他设置

它实际上只是输出一组完全没有逻辑(决策)的路由。这个命令只是一个速记方法,可以防止您自己编写所有这些路由

话虽如此,你没有理由使用这种速记。您可以自己手动创建所有这些路由。查看我上面链接的源代码,或者运行
phpartisan r:l
(另一个缩写是
route:list
,用于任何阅读本文的noob)并将相同的输出复制到routes文件中。这允许您根据自己的喜好跳过或修改任何路线

如果您想在不使用速记命令的情况下添加路由,则路由将是这样的。请确保删除该命令并将其粘贴到中。无论您要删除或修改哪个命令,都可以像任何其他路由一样轻松完成。我从Laravel源代码中获取了这一点,因此它与速记命令创建的完全相同,包括路线的顺序(技术上也包括注释)

因此,如果要复制此代码块并将其添加到routes文件中,它将提供与速记
Auth::routes()
命令完全相同的结果(并在幕后执行相同的操作)。现在,您可以自定义或删除所需的任何命令

如何将注销路径更改为
GET
路径? 现在我们已经讨论了如何使用认证脚手架路线,让我们来回答问题背后的问题。您希望通过
GET
请求来访问注销命令(而不是
POST
请求,这是Laravel默认设置的方式)

很简单,有两种方法可以做到这一点:

1) 复制所有路由并将注销路由更改为
GET
请求

这很简单,删除
Auth::routes()
速记,然后复制我在上面发布的路由,并将其粘贴到您的路由文件中,位置与您的
// User Authentication Routes
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');

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

// User 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')->name('password.update');

// User Verification Routes
Route::get('email/verify', 'Auth\VerificationController@show')->name('verification.notice');
Route::get('email/verify/{id}/{hash}', 'Auth\VerificationController@verify')->name('verification.verify');
Route::post('email/resend', 'Auth\VerificationController@resend')->name('verification.resend');
// 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');
// 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');
Auth::routes();
Route::get('logout', 'Auth\LoginController@logout');