0

我正在尝试为具有相同 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 条路由,为授权用户使用不同的控制器吗?

4

1 回答 1

2

您可以创建新的中间件:

<?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

于 2016-10-28T18:14:43.033 回答