J. *_*son 3 php authentication routes laravel laravel-5
所以出于某种原因,我以为我之前遇到过这个问题的答案,但对于我的生活,我无法通过Google或StackOverflow再次找到答案.这可能只是一个橡皮鸭问题而且我很抱歉,如果是的话,但我希望这个问题对某人来说会有一些用处.
让我们假设我们从一个全新安装的Laravel 5.4开始.我php artisan make:auth在终端中运行命令,它为我设置了身份验证脚手架.现在在我的/routes/web.php文件中,我看到以下行:
Auth::routes();
哪个很棒,路由列表中列出了所有的Authentication路由,包括定义的注销路由.(键入php artisan r:l以仔细检查)现在我想使用自定义Logout Controller为用户设置自定义注销路由.现在,我认为有一种方法可以链接到一组名为'except()'的资源路由,但就我而言,我在文档中找不到有关此方法的任何信息.我不知道这种方法是否存在,更不用说知道传递什么了.
我假设Auth::routes()代可以使用像资源路径中的except方法,但我不完全确定如何实现它?
所以问题很简单.如何包括除注销路由之外的所有身份验证路由,然后我将使用以下行定义注销路由.
Route::get('logout', 'LogoutController@userLogout')->name('logout');
很抱歉,如果这是一个重复的条目,我在过去一小时内使用了搜索栏,没有回答我的问题.
编辑:我对资源路由进行了更多的研究,并意识到它不是我链接到路由的方法,而是一个带有键值对的数组.请参阅下面的代码(从laravel docs中删除).
Route::resource('photo', 'PhotoController', ['except' => [
    'create', 'store', 'update', 'destroy'
]]);
但是当我将数组传递给routes()方法时(参见下面的代码),注销路径仍然在路由列表中.但是,该php artisan r:l命令不会抛出任何错误.
// User Authentication Routes
Auth::routes(['except' => 'logout']);
编辑:经过大量挖掘,似乎不可能做这种类型的功能.我已向laravel/framework github repo提交了一个问题,要求在5.5中添加该功能.
jac*_*tis 11
罗宾逊,感谢您在Twitter上与我联系,寻求这个答案的帮助.我实际上认为这是一个很好的问题,并希望这个问题能够在谷歌的排名中找到未来的开发者,以便在社区中引发一些讨论.
Auth::routes()命令生成注销路由?长话短说...... 你做不到.如果你想使用Auth::routes()速记,那么它是一种全有或全无的命令.您可以在这里查看Laravel v5.5中该命令背后的实际源代码(虽然它自5.2版以来它没有改变),并且查看简写命令背后的实际代码,您可以看到它不接受任何参数,例如['except' => 'logout']数组你可以期待Laravel中的其他路径助手命令.这里没有任何隐藏的,未记录的秘密来使这个命令做任何独特的事情,通过检查源代码,我们可以看到除了返回预先设置的路由列表之外,它没有被设置为做任何事情.
它实际上只输出一组没有逻辑(决策)的路线.此命令只是一种速记方法,可以防止您自己编写所有这些路径.
话虽如此,没有理由你必须使用这种速记.您可以自己手动制作所有这些路线.查看我上面链接的源代码或运行php artisan r:l(route:list读取此内容的任何noobs的另一个简写)并将相同的输出复制到路径文件中.这允许您跳过或修改任何您喜欢的路线.
如果您想在没有速记命令的情况下添加路线,这就是路线的样子.确保删除该命令并将其粘贴到其中.无论您想要删除或修改哪个命令都可以像其他任何路径一样轻松完成.我把这个从Laravel源代码,所以它是100%EXACTLY一样的速记命令创建,包括路由(和技术上的评论太)的顺序.
// 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请求访问logout命令(而不是POSTLaravel默认设置的请求).
很简单,有两种方法可以做到这一点:
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()速记之外的版本.
这最终将通过a GET和POST请求访问注销路由.它们都链接到相同的方法,因此它们执行相同的操作并以相同的方式工作,现在您可以作为a POST或GET请求注销.
此选项的结果代码如下:
Auth::routes();
Route::get('logout', 'Auth\LoginController@logout');
请注意,我从第二行省略了名称.它已经命名归功于该Auth::routes()命令.所以你不需要再次命名.这个logout名字仍然可以使用.因此,您仍然可以<a href="{{ route('logout') }}">Logout</a>在刀片文件中使用,无论您是将其用作请求GET还是路径名,路由名称都将起作用POST.
所以,你去了一个漫长的蜿蜒旅程,进入Auth::routes()速记命令的世界.
| 归档时间: | 
 | 
| 查看次数: | 6122 次 | 
| 最近记录: |