Robinson,感谢 reaching out to me on Twitter 对此答案的帮助。我实际上认为这是一个很好的问题,并希望这个问题能够在 Google 的排名中上升,以供未来的开发人员找到,并可能在社区中引发一些讨论。
如何防止使用Auth::routes()命令产生注销路由?
长话短说...你不能。如果你想使用Auth::routes()速记,那么它是一种all-or-nothing类型的命令。 You can view the actual source code behind that command here for Laravel v5.5(尽管我相信它自 5.2 版以来没有改变),查看速记命令背后的实际代码,您可以看到它不接受任何参数,例如您对其他路由辅助命令所期望的 ['except' => 'logout'] 数组在拉拉维尔。这里没有隐藏的、未记录的秘密可以让这个命令做任何独特的事情,通过检查源代码我们可以看到它没有设置做任何事情,除了返回一个预设的路由列表。
它实际上只是输出一组完全没有逻辑(决策)的路线。此命令只是一种速记方法,可让您不必自己编写所有这些路由。
话虽如此,您没有理由必须使用这种速记。您可以自己手动制作所有这些路线。查看我在上面链接的源代码或运行php artisan r:l(route:list 的另一种简写形式,用于阅读本文的任何新手)并将相同的输出复制到您的路线文件中。这使您可以根据自己的喜好跳过或修改任何路线。
如果您想在不使用速记命令的情况下添加路由,这就是路由的样子。确保删除该命令并将其粘贴进去。无论您想删除或修改哪个命令,都可以像任何其他路线一样轻松完成。我从 Laravel 源代码中获取了这个,所以它与创建的速记命令 100%完全一样相同,包括路线的顺序(以及技术上的 cmets)。
// 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');
因此,如果您想复制此代码块并将其添加到您的路线文件中,它将为您提供与速记 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) 第二种选择是在您的 Auth::routes() 速记之外添加一个 GET 版本。
这最终将使注销路由可以通过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() 速记命令世界的漫长曲折之旅。