【问题标题】:Override default Auth routes in Laravel >= 5.4覆盖 Laravel >= 5.4 中的默认 Auth 路由
【发布时间】:2017-08-30 15:52:18
【问题描述】:

我想覆盖/login 路由到/admin/login。在web.php我试过了

//Auth::routes();
Route::get('login', ['as' => 'auth.login', 'uses' => 'App\Modules\Admin\Controllers\AdminUserController@loginAdminUser'])->name('login');

但它仍然显示 Laravel 默认登录表单。我该怎么做?

【问题讨论】:

  • 请记住,当你更新你的 laravel 应用程序时,这一切都会重置。
  • 阅读本指南medium.com/@panjeh/…

标签: php laravel laravel-5


【解决方案1】:

对于谷歌用户,这里是由Auth::routes(); 在 Laravel >= 5.4 中生成的完整路由列表

// Authentication Routes...
Route::get('login', [
  'as' => 'login',
  'uses' => 'Auth\LoginController@showLoginForm'
]);
Route::post('login', [
  'as' => '',
  'uses' => 'Auth\LoginController@login'
]);
Route::post('logout', [
  'as' => 'logout',
  'uses' => 'Auth\LoginController@logout'
]);

// Password Reset Routes...
Route::post('password/email', [
  'as' => 'password.email',
  'uses' => 'Auth\ForgotPasswordController@sendResetLinkEmail'
]);
Route::get('password/reset', [
  'as' => 'password.request',
  'uses' => 'Auth\ForgotPasswordController@showLinkRequestForm'
]);
Route::post('password/reset', [
  'as' => 'password.update',
  'uses' => 'Auth\ResetPasswordController@reset'
]);
Route::get('password/reset/{token}', [
  'as' => 'password.reset',
  'uses' => 'Auth\ResetPasswordController@showResetForm'
]);

// Registration Routes...
Route::get('register', [
  'as' => 'register',
  'uses' => 'Auth\RegisterController@showRegistrationForm'
]);
Route::post('register', [
  'as' => '',
  'uses' => 'Auth\RegisterController@register'
]);

php artisan route:list 将返回

+--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
| Domain | Method   | URI                    | Name             | Action                                                                 | Middleware   |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
|        | GET|HEAD | login                  | login            | App\Http\Controllers\Auth\LoginController@showLoginForm                | web,guest    |
|        | POST     | login                  |                  | App\Http\Controllers\Auth\LoginController@login                        | web,guest    |
|        | POST     | logout                 | logout           | App\Http\Controllers\Auth\LoginController@logout                       | web          |
|        | POST     | password/email         | password.email   | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail  | web,guest    |
|        | GET|HEAD | password/reset         | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web,guest    |
|        | POST     | password/reset         | password.update  | App\Http\Controllers\Auth\ResetPasswordController@reset                | web,guest    |
|        | GET|HEAD | password/reset/{token} | password.reset   | App\Http\Controllers\Auth\ResetPasswordController@showResetForm        | web,guest    |
|        | GET|HEAD | register               | register         | App\Http\Controllers\Auth\RegisterController@showRegistrationForm      | web,guest    |
|        | POST     | register               |                  | App\Http\Controllers\Auth\RegisterController@register                  | web,guest    |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+

【讨论】:

  • 电子邮件验证(5.6+):$this->get('email/verify', 'Auth\VerificationController@show')->name('verification.notice'); $this->get('email/verify/{id}', 'Auth\VerificationController@verify')->name('verification.verify'); $this->get('email/resend', 'Auth\VerificationController@resend')->name('verification.resend');
  • 在较新版本的 Laravel(在我的例子中是 5.7)中,路由是相同的,但做了一个更改。密码重置路由POST password/reset 有一个别名'password.update'。我认为为旧版本设置别名也不是问题。因此,让我们更改您的解决方案并添加该别名。
  • @algorhythm 感谢您的提示。你是对的,没有人会被别名伤害。
  • 5.8.17 GET|HEAD:登录、密码/重置、密码/重置/{token}、注册 POST:登录、注销、密码/重置、注册、密码/电子邮件
【解决方案2】:

你可以找到 Laravel 5.7 的所有登录路径。有一些新的东西,电子邮件验证。相关文档为here

代码块中的 If 语句基本上启用/禁用身份验证功能。通过使用助手,您可以将registerresetverify 参数传递给Auth::routes(['verify' => true]);。因此,请使用 config() 修复 if 语句,或者随意使用。

到此结束!
当您拨打Auth::routes()时,将注册以下路线。

Route::get('login', 'LoginController@showLoginForm')->name('login');
Route::post('login', 'LoginController@login');
Route::post('logout', 'LoginController@logout')->name('logout');

// Registration Routes...
if (config('register'))
{
    Route::get('register', 'RegisterController@showRegistrationForm')->name('register');
    Route::post('register', 'RegisterController@register');
}
// Password Reset Routes...
if (config('reset'))
{
    Route::get('password/reset', 'ForgotPasswordController@showLinkRequestForm')->name('password.request');
    Route::post('password/email', 'ForgotPasswordController@sendResetLinkEmail')->name('password.email');
    Route::get('password/reset/{token}', 'ResetPasswordController@showResetForm')->name('password.reset');
    Route::post('password/reset', 'ResetPasswordController@reset')->name('password.update');
}
// Email Verification Routes...
if (config('verify'))
{
    Route::get('email/verify', 'VerificationController@show')->name('verification.notice');
    Route::get('email/verify/{id}', 'VerificationController@verify')->name('verification.verify');
    Route::get('email/resend', 'VerificationController@resend')->name('verification.resend');
}

【讨论】:

  • 如何在我的 laravel 应用中为这些模块设置名称
  • 基本上删除路由文件中的Auth::routes() 或覆盖路由文件中默认的 Laravel auth 路由。任何进一步的帮助,您必须提供有关您想要实现的目标的更多信息。
【解决方案3】:

5.5 LTS(已确认)/5.6(已确认)/5.7(?)的路线

有人可以确认它适用于 5.7 吗?

// 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');

【讨论】:

  • 谢谢。这个与 Laravel 5.6 相同的 Route Auth :)
  • 刚到这里确认我的sn-p还在5.6工作
  • 感谢卢卡斯!但是...文件在哪里,所以我可以覆盖它?
  • @gtamborero 这些是路线,在 Laravel 上查找路线文档
  • 谢谢卢卡斯。那是目录-> vendor/laravel/framework/src/Illuminate/Routing/Router.php
【解决方案4】:

当我遇到同样的问题时,我设法找到了一个覆盖 laravel 5.5 路线的好方法:

静态函数 Auth::routes(); :

public static function routes()
{
    static::$app->make('router')->auth();
}

这里调用了 auth() 函数来创建身份验证路由:

laravel/framework/src/Illuminate/Routing/Router.php

public function auth()
{
    // Authentication Routes...
    $this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
    $this->post('login', 'Auth\LoginController@login');
    $this->post('logout', 'Auth\LoginController@logout')->name('logout');

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

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

您可以将函数的主体复制并粘贴到您的 web.php 中,并根据需要进行修改。

【讨论】:

    【解决方案5】:

    你也可以试试这个。

    // Replace admin with whatever prefix you need
    
    Route::group(['prefix' => 'admin'], function () {
    
        Auth::routes();
    
    });
    

    您可以通过以下命令查看路线列表。

    php artisan route:list

    【讨论】:

    • 非常感谢,没有这个导致我不得不开始重写所有的路由,不仅如此,所有的 LoginController 方法都要重写,并且路由重命名以避免混淆。我能够使用此前缀删除所有自定义路由!
    • 完美!适用于 5.7
    • 适用于 5.8 :)
    • 谢谢你,我这两天一直在寻找这个答案
    • 太棒了!这应该是正确的答案。
    【解决方案6】:

    把它改成:

    Route::get('/admin/login', ['as' => 'admin.login', 'uses' => 'App\Modules\Admin\Controllers\AdminUserController@loginAdminUser']);
    
        Route::get('login', ['as' => 'login', 'uses' => 'App\Modules\Admin\Controllers\AdminUserController@loginAdminUser']);
    

    name函数是数组的as键的同义词。所以不用在最后加上name

    【讨论】:

    • 如果用户尝试 /login 会发生什么?
    • 它会抛出一个NotFoundHttpException
    • 但我想覆盖这条路由到 '/admin/login'
    • 如果您想同时使用两条路线,您可以添加两条路线。检查答案。
    猜你喜欢
    • 2019-09-04
    • 2023-04-01
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 2017-01-17
    • 1970-01-01
    • 2012-04-02
    相关资源
    最近更新 更多