如何在 Laravel 7 中正确定义我的身份验证路由?

How to properly define my authenticate routes in Laravel 7?

我是 laravel 的新手,我正在尝试定义我的 routes.And 逻辑是“/”路由到“/login”(如果用户未通过身份验证和“/login”路由)登录查看 blade.Down 以下是路线。

Auth::routes();

Route::get('/clear-cache', function() {
    Artisan::call('cache:clear');
});

Route::get('login', function (){

    return view('auth/login');

});

Route::get('register', function (){

    if(Auth::check()){

        return view('home');

    }else{

        return view('auth/register');
    }

});

Route::get('/', function () {

    if(Auth::check()){

        return view('home');

    }else{

        return redirect('/login');

    }
});




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

但我一直收到此错误 "Route [login] not defined.",但我看不出问题所在。

如果我在全新的 laravel 7 安装中添加 Auth::routes(),则会在 artisan route:list 上显示:

+--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
| Domain | Method   | URI                    | Name             | Action                                                                 | Middleware   |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
|        | GET|HEAD | /                      |                  | Closure                                                                | web          |
|        | GET|HEAD | api/user               |                  | Closure                                                                | api,auth:api |
|        | 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          |
|        | GET|HEAD | password/confirm       | password.confirm | App\Http\Controllers\Auth\ConfirmPasswordController@showConfirmForm    | web,auth     |
|        | POST     | password/confirm       |                  | App\Http\Controllers\Auth\ConfirmPasswordController@confirm            | web,auth     |
|        | POST     | password/email         | password.email   | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail  | web          |
|        | GET|HEAD | password/reset         | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web          |
|        | POST     | password/reset         | password.update  | App\Http\Controllers\Auth\ResetPasswordController@reset                | web          |
|        | GET|HEAD | password/reset/{token} | password.reset   | App\Http\Controllers\Auth\ResetPasswordController@showResetForm        | web          |
|        | GET|HEAD | register               | register         | App\Http\Controllers\Auth\RegisterController@showRegistrationForm      | web,guest    |
|        | POST     | register               |                  | App\Http\Controllers\Auth\RegisterController@register                  | web,guest    |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+

然后您应该避免使用不同的实现再次定义相同的路由。让 Laravel 为您代劳。
如您所见,也已经有中间件应用于这些预定义路由。 web 在这种情况下不是中间件本身,而是在 app/Http/Kernel.php 处定义的中间件组。有关中间件组的更多信息,请参阅下文。

如果您想从您的项目中使用 "remove" / - 路由,您可以使用重定向路由。
https://laravel.com/docs/7.x/routing#redirect-routes

所以你的路由文件应该是这样的:

Auth::routes();

Route::get('/clear-cache', function() {
    Artisan::call('cache:clear');
});

// this will let laravel automatically redirect again if already logged in
Route::permanentRedirect('/', '/login');

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

将您重定向到 /home 路线的自动化是 app/Http/Middleware/RedirectIfAuthenticated.phpapp/Providers/RouteServiceProvider.php 之间的交互。

在后者中,您有一个属性定义您的 HOME

    /**
     * The path to the "home" route for your application.
     *
     * @var string
     */
    public const HOME = '/home';

如果您以后有更多路由应该应用 auth()-中间件,您可以使用三种方法(或可能是 4 种):

请将以下示例与此 link 进行比较:
https://laravel.com/docs/7.x/middleware#middleware-groups

一般情况下刚开始可能有点难看,controller route和那些使用closure function的没有什么区别。两种实现可以使用的方法相同。只有应用程序中路由的处理会有所不同。

对于需要中间件的单个路由,只需将其添加到末尾即可。 这适用于控制器路由以及关闭路由。

Route::get('/', function () {
    //
})->middleware('web');
// ^^^^ is as possible as:
Route::get('/', 'Controller@Method')->middleware('web');

对于使用相同中间件的多个路由,请使用中间件方法。 可以使用分配为数组一部分的多个中间件。

Route::middleware(['web', 'subscribed'])->group(function () {
    //
});

如果您还需要更多自定义,请直接使用 group()-方法。 在这里你不仅可以定义中间件,还可以定义所有封闭路由的前缀

Route::group(['middleware' => ['web'], 'prefix'=>'admin'], function () {
    //
});

作为最后一个选项,您可以将任何您想要的中间件添加到现有中间件组或在 app/Http/Kernel.php? 中添加您自己的中间件组。但这将导致非常强大的集成,如果您想偏离轨道,则很难构建异常,因为中间件组中的所有内容一直用于该组应用于的每个路由。

请不要将路由组与中间件组混用,因为它们是不同的东西。

所有这些示例都可以在第 7 版的文档中找到,因此它们应该也适用于您的情况。