【问题标题】:Laravel 5.3 routes one url 2 controllers middlewareLaravel 5.3 路由一个 url 2 个控制器中间件
【发布时间】:2017-03-11 16:08:29
【问题描述】:

我正在尝试为具有相同 URI 的授权用户(中间件身份验证)和来宾(中间件来宾)使用不同的控制器,但我无法让它在 laravel 5.3 中工作。

我尝试使用相同的 URI 和不同的中间件创建 2 条路由,但无法使用相同的 URI 创建 2 条路由。

我尝试了很多东西,但是在 laravel 5.3 中我不能在路由文件中使用Auth::check(),它总是会返回 false:

Route::get('/', [
    'as' => 'home', 
    'uses' => (Auth::check() ? 'User\DashboardController' : 'Guest\HomeController'),
]);

我也试过在路由中使用一个函数:

Route::get('/', [
    'as' => 'home', 
    'uses' => function (){
        $app = app();
        if(Auth::check()){
            $controller = $app->make('App\Http\Controllers\User\DashboardController'); 
            return $controller->callAction('getIndex', $parameters = []);
        }else{
            $controller = $app->make('App\Http\Controllers\Guest\HomeController');
            return $controller->callAction('getIndex', $parameters = []);
        }
    }
]);

现在Auth::check() 主要工作,但现在控制器__construct 函数中的中间件被忽略。而且这看起来不太好。

当我从登录重定向到此路由 Auth::check() 返回 false 时,我也遇到了问题。但如果我刷新页面,它会返回 true。

我不想使用 1 个控制器并在该控制器中同时处理用户和来宾,这是因为我的用户控制器扩展了另一个类而不是我的来宾控制器。

有人知道我怎样才能有 1 条路由,一个用于访客的控制器和一个用于授权用户的不同控制器?

【问题讨论】:

    标签: php laravel-routing laravel-5.3 laravel-authorization


    【解决方案1】:

    您可以创建新的中间件:

    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    
    class isGuest
    {
        public function handle($request, Closure $next)
        {
            if (! \Auth::check()) {
                return redirect('/guest-page');
            }
    
            return $next($request);
        }
    }
    

    然后需要在app/Http/Kernel.php中注册新的中间件

    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    ];
    

    然后将其附加到所需的路线:

        Route::get('user', [
            'uses' => 'UsersController@index',
            'as' => 'users.index'
        ])->middleware('isGuest');
    

    你也可以为一个路由使用多个中间件:

      Route::get('user', [
            'uses' => 'UsersController@index',
            'as' => 'users.index'
        ])->middleware('isGuest', 'secondMiddleware' ...);
    

    更多信息在这里:https://laravel.com/docs/5.3/middleware#global-middleware

    【讨论】:

    • 谢谢,但这并不能解释我如何在一个 URI 上拥有 2 个控制器...
    • @JanWytze 你不能。您不应该将逻辑放在路由定义中。按照 Roman 的建议使用中间件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2023-04-10
    • 1970-01-01
    • 2017-07-19
    • 2017-03-06
    • 1970-01-01
    相关资源
    最近更新 更多