【问题标题】:Laravel 5.7 global middleware is not workingLaravel 5.7 全局中间件不工作
【发布时间】:2019-02-22 03:49:45
【问题描述】:

我想在我的 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 还很陌生...

谢谢!

【问题讨论】:

    标签: php laravel middleware laravel-blade


    【解决方案1】:

    您需要开始一个会话,然后才能使用它进行任何工作,如果您阅读股票kernel.php,您将看到该会话仅在web 组中启动(通过@987654325 @),所以你需要在它下面添加自己的中间件。

    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 和自定义警卫,但不是会话来完成此类工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-26
      • 2019-06-22
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 2017-09-10
      • 2017-07-20
      • 1970-01-01
      相关资源
      最近更新 更多