Laravel 5.7全球中间件无法正常工作

时间:2018-09-18 07:19:08

标签: php laravel middleware laravel-blade

我想在laravel项目中创建一个中间件,以检查哪种类型的用户登录到我的网站。想法是,我检查用户是否已登录中间件,然后将会话变量设置为某个值。

这是中间件:

CheckIfLoggedin.php

use Closure;
use Auth;

class CheckIfLoggedin
{
    public function handle($request, Closure $next)
    {
        if (Auth::check()) {
            $request->session()->put('loggedin', 'admin');
        }
        return $next($request);
    }
}

我已按照文档中的说明将其注册为全局中间件,方法是将该行添加到 Kernel.php

protected $middleware = [
    // ...
    \App\Http\Middleware\CheckIfLoggedin::class,
];

然后我在刀片服务器模板中检查此会话变量的值,如下所示:

@if(session('loggedin'))
    <!-- some html code -->
@endif

我知道我也可以将其用于登录验证:

@auth
    <!-- some html code -->
@endauth

但是使用此会话变量的原因是我将有不同类型的成员(例如memberadmin),并且稍后我会将登录类型分配给该会话变量,然后,它应该在刀片模板中像这样工作:

@if(session('loggedin')=='member')
    <!-- some html code that only members can see -->
@elseif(session('loggedin')=='admin')
    <!-- some html code that only admins can see -->
@endif

关于为什么这种中间件无法正常工作的任何想法?请注意,尽管我对Laravel还是陌生的。

谢谢!

1 个答案:

答案 0 :(得分:4)

您需要开始会话,然后才能进行任何操作,如果您阅读了股票kernel.php,则将看到该会话仅在web组中开始(通过\Illuminate\Session\Middleware\StartSession::class),因此您需要在其下方添加自己的中间件。

protected $middleware = [
    \App\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    \App\Http\Middleware\TrustProxies::class,
];
/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

  

注意:我要做的是利用policies and gates以及自定义警卫,但不是会话来完成此类工作。