【问题标题】:laravel 5.3 new Auth::routes()laravel 5.3 新的 Auth::routes()
【发布时间】:2017-01-04 22:29:05
【问题描述】:

最近开始用laravel 5.3写博客,但是运行后有个问题php artisan make:auth

当我运行它时,它会在我的web.php 中生成路由

这是其中的代码:

Auth::routes();

Route::get('/home', 'HomeController@index');

然后我运行php artisan route:list,我发现很多动作,比如 LoginController@login...

但我在App\Http\Controllers\Auth 中没有找到这些动作,这些在哪里?

还有Auth::routes()代表什么,我找不到关于Auth的路由。

我需要帮助,谢谢你回答我的问题

【问题讨论】:

  • 我现在是唯一一个讨厌所有 Laravel 魔法的人吗?
  • 我不介意 laravel 的魔法,只要它们被记录在案……并且可以始终如一地工作,而无需在服务器周围走来走去,同时吟唱 php artisan..what?
  • Laravel 的一切都不是为开发者准备的,它是为希望快速轻松地开发新应用程序的公司和新手用户提供的,甚至是他们的文档。如果可以选择,我仍然更喜欢 Codeigniter。
  • 阅读本指南:medium.com/@panjeh/…
  • @MuhammadUsman 谈论魔法,现在有 laravel jetstream...

标签: php laravel laravel-5 laravel-5.3


【解决方案1】:

loginuser 类使用称为AuthenticatesUsers 的特征

如果您打开该特征,您将看到功能(这适用于其他控制器) Illuminate\Foundation\Auth\AuthenticatesUsers;

这是特征代码https://github.com/laravel/framework/blob/5.1/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php

抱歉格式不好,我用的是手机

还有Auth::routes() 它只是调用了一个返回授权路由的函数(我认为)

【讨论】:

  • 是的,我查看了 Auth/ 目录,但是我没有找到方法,例如 App\Http\Controllers\Auth\ResetPasswordController@showResetForm,在哪里可以找到 @ 之后的方法,我花了很多时间找到它,但现在我也找不到它..我是 laravel 的新手..
  • 这里是完整路径vendor\laravel\src\Illuminate\Foundation\Auth\ResetsPasswords,如果你想改变这个什么的,不要改变这个,只需将相同的方法添加到你的控制器然后改变它,
  • @Achraf Khouadja,看来你是 laravel 大师。我需要你帮忙。看这里:stackoverflow.com/questions/41047583/…
【解决方案2】:

Auth::routes() 只是一个帮助类,可帮助您生成用户身份验证所需的所有路由。你可以在这里浏览代码https://github.com/laravel/framework/blob/5.3/src/Illuminate/Routing/Router.php

这里是路线

// 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');
$this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail');
$this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm');
$this->post('password/reset', 'Auth\ResetPasswordController@reset');

【讨论】:

  • 谢谢!我看到了 ../Routing/Router.php,现在我知道路由是如何工作的。但是 Auth 静态方法 routes() 在哪里?还是找不到,原谅我是laravel初学者……
  • Auth::routes 方法在这里 github.com/laravel/framework/blob/5.3/src/Illuminate/Support/… 并且无论如何它都会调用路由器函数。如果对您有帮助,请将此标记为答案,谢谢。
  • Auth 是一个facade,将在config/app.php 中定义您将在该配置文件中找到充当其提供者的类。
  • 有相同但出现错误:NotFoundHttpException in RouteCollection.php line 161:,另一个 api 运行良好。
  • $this->get('login', 'Auth\LoginController@showLoginForm')->name('login'); 无法运行Auth api's
【解决方案3】:

为 Laravel 5.3 验证路由而不是 Auth::routes()。 希望对你有帮助...

Route::group(['middleware' => ['web']], function() {

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

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

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

因此,如果您更改了这些路线的某些名称,请记住在视图中也更改帖子的操作!

【讨论】:

  • 谢谢,但您不需要 'middleware' => ['web'] 因为:开箱即用,web 中间件组会自动应用于您的 routes/web.php 文件RouteServiceProvider。
  • @panjeh 这似乎适用于主要的routes/web.php 文件。但是,对于供应商目录中的任何此类文件(即,如果您尝试将 auth 内容移动到包中),您需要自己添加 Web 中间件。
【解决方案4】:

函数调用顺序:

  1. (Auth)Illuminate\Support\Facades\Auth@routes (https://github.com/laravel/framework/blob/5.3/src/Illuminate/Support/Facades/Auth.php)
  2. (App)Illuminate\Foundation\Application@auth
  3. (路由)照明\路由\路由器

路线是这样的:

public function auth()
{
    // Authentication Routes...
    $this->get('login', 'Auth\AuthController@showLoginForm');
    $this->post('login', 'Auth\AuthController@login');
    $this->get('logout', 'Auth\AuthController@logout');
    // Registration Routes...
    $this->get('register', 'Auth\AuthController@showRegistrationForm');
    $this->post('register', 'Auth\AuthController@register');
    // Password Reset Routes...
    $this->get('password/reset/{token?}', 'Auth\PasswordController@showResetForm');
    $this->post('password/email', 'Auth\PasswordController@sendResetLinkEmail');
    $this->post('password/reset', 'Auth\PasswordController@reset');
}

【讨论】:

  • 这个答案实际上阐明了 OP 提出的问题。谢谢@SilentCat。
  • 我认为最好口头解释上面这 3 个步骤中发生的情况:Auth::routes() - Auth 外观 - 从 Laravel 容器中检索 Router 对象实例并调用其预先存在的方法authauth 又定义了由php artisan make:auth 生成的路由及其各自的控制器。就是这样。
【解决方案5】:

对于 Laravel 5.5.x

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

【讨论】:

    【解决方案6】:

    这对我来说适用于 Laravel 5.6

    在文件web.php中,只需替换:

    Auth::routes();
    

    作者:

    //Auth::routes();
    // Authentication Routes...
    Route::get('admin/login', 'Auth\LoginController@showLoginForm')->name('login');
    Route::post('admin/login', 'Auth\LoginController@login');
    Route::post('admin/logout', 'Auth\LoginController@logout')->name('logout');
    // 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');
    

    并删除以下两个文件中的注册链接:

    welcome.blade.php
    layouts/app.blade.php
    

    【讨论】:

      【解决方案7】:

      这里是 Laravel 5.7Laravel 5.8Laravel 6.0Laravel 7.0Laravel 8.0 (注意 6.0 中对电子邮件验证路线的细微改动)。

      // 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')->name('password.update');
      
      // Confirm Password (added in v6.2)
      Route::get('password/confirm', 'Auth\ConfirmPasswordController@showConfirmForm')->name('password.confirm');
      Route::post('password/confirm', 'Auth\ConfirmPasswordController@confirm');
      
      // Email Verification Routes...
      Route::get('email/verify', 'Auth\VerificationController@show')->name('verification.notice');
      Route::get('email/verify/{id}/{hash}', 'Auth\VerificationController@verify')->name('verification.verify'); // v6.x
      /* Route::get('email/verify/{id}', 'Auth\VerificationController@verify')->name('verification.verify'); // v5.x */
      Route::get('email/resend', 'Auth\VerificationController@resend')->name('verification.resend');
      

      您可以在此处验证这些路线:

      【讨论】:

      • 正如您的链接所示,从 5.8 到 6.x 确实有一个小的变化:电子邮件验证链接的路由应该是 'email/verify/{id}/{hash}'。否则无法验证哈希,并会抛出 403 错误,提示“此操作未经授权”。
      【解决方案8】:

      我很惊讶没有人提到命令 php artisan route:list,它列出了所有已注册的应用程序路由(包括 Auth::routes()Passport::routes(),如果已注册)

      【讨论】:

        【解决方案9】:

        如果你正在为 laravel 7 版本搜索这些相同的路线,你会在这里找到它Vendor/laravel/ui/src/AuthRouteMethods.php

        【讨论】:

          【解决方案10】:

          如果你在 laravel 5.7 及以上版本 Auth::routes(['register' => false]); 在 web.php 中

          更多可能的选项如下:

          Auth::routes([
            'register' => false, // Routes of Registration
            'reset' => false,    // Routes of Password Reset
            'verify' => false,   // Routes of Email Verification
          ]);
          

          【讨论】:

            【解决方案11】:

            对于 Laravel 8:

            use App\Http\Controllers\Auth\LoginController;
            use App\Http\Controllers\Auth\RegisterController;
            use App\Http\Controllers\Auth\ForgotPasswordController;
            use App\Http\Controllers\Auth\ConfirmPasswordController;
            use App\Http\Controllers\Auth\VerificationController;
            
            Route::get('login', [LoginController::class, 'showLoginForm'])->name('login');
            Route::post('login', [LoginController::class,'login']);
            Route::post('logout',  [LoginController::class,'logout'])->name('logout');
            
            // Registration Routes...
            Route::get('register', [RegisterController::class, 'showRegistrationForm'])->name('register');
            Route::post('register', [RegisterController::class, 'register']);
            
            // Password Reset Routes...
            Route::get('password/reset', [ForgotPasswordController::class, 'showLinkRequestForm'])->name('password.request');
            Route::post('password/email', [ForgotPasswordController::class, 'sendResetLinkEmail'])->name('password.email');
            Route::get('password/reset/{token}', [ForgotPasswordController::class, 'showResetForm'])->name('password.reset');
            Route::post('password/reset', [ForgotPasswordController::class, 'reset'])->name('password.update');
            
            // Confirm Password 
            Route::get('password/confirm', [ConfirmPasswordController::class, 'showConfirmForm'])->name('password.confirm');
            Route::post('password/confirm', [ConfirmPasswordController::class, 'confirm']);
            
            // Email Verification Routes...
            Route::get('email/verify', [VerificationController::class, 'show'])->name('verification.notice');
            Route::get('email/verify/{id}/{hash}', [VerificationController::class, 'verify'])->name('verification.verify');
            Route::get('email/resend',  [VerificationController::class, 'resend'])->name('verification.resend');
            
            // Home
            Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
            

            【讨论】:

              【解决方案12】:

              为时已晚,但就是这样, 该函数生成的路由:

              // 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');
              $this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail');
              $this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm');
              $this->post('password/reset', 'Auth\ResetPasswordController@reset');
              

              【讨论】:

              • 与 f.ex 相比,您的答案的附加值是多少?接受的答案?
              猜你喜欢
              • 1970-01-01
              • 2017-04-28
              • 1970-01-01
              • 2017-03-30
              • 2017-04-30
              • 1970-01-01
              • 2022-10-05
              • 2020-12-19
              • 2017-03-17
              相关资源
              最近更新 更多