Session Laravel 中未设置变量

Session variable isn't set in Laravel

各位。

我做了一个中间件。我做了一个全局的,把它放到 Kernel.php 中,每个请求都会调用它,并验证用户是否登录。

关键是我需要为此使用 session。但是 session 是空的。可能是因为它稍后在脚本中填充。 所以我使用名为“\Illuminate\Session\Middleware\StartSession::class”的全局中间件修复它。这很棒,因为在那之后我可以在我的中间件中看到 session 包含的内容。

但是出现了另一个错误。由于我放置了“\Illuminate\Session\Middleware\StartSession::class”中间件,我的重定向不再放在 session 变量上。

到目前为止,下面的代码运行良好,重定向在 session:

上创建了 arsh 变量
return redirect('/admin')->with('arsh', $arsh);

但现在不再将 arsh 变量放在重定向 session 上。

我在网上查了很多资料,但一无所获。我看到了很多建议,但没有一个有效。

我只是不知道我能做什么。如果你知道一些东西会很棒。

你也可以考虑在我的中间件中使用另一种解决方法来读取session,这可能就不需要再考虑上一个错误了。

我希望你能理解我写的东西,对不起我的英语。

编辑:

我做了哈穆德说的: 我将我的中间件 (\App\Http\Middleware\RedirectIfNotAuthenticated::class,) 从 $middleware 移到了 $middlewareGroups:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    \App\Http\Middleware\TrimStrings::class,
];

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \App\Http\Middleware\RedirectIfNotAuthenticated::class, // my middleware
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];

现在重定向效果很好,可以在 session 上设置变量。但是我的中间件不再工作了:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;
use Session;
use Request;

class RedirectIfNotAuthenticated
{
    /**
     * handle
    */
    public function handle($request, Closure $next, $guard = null)
    {   
        if ($request->is('admin/*') && !$request->is('admin') && !$request->is('admin/login') && (!Session::has(_DB_PREFIX_.'id_admin') || !Session::has(_DB_PREFIX_.'name_admin'))) {
            return redirect('/admin');
        }

        return $next($request);
    }
}

如果陈述永远不会为真... 那是因为 $middleware 在验证路由之前被调用,而 $middlewareGroups 在之后被调用。因此,当我的 url 类似于 domain.com/admin/fgtsdr.

时,我将重定向到 404

我的中间件所做的是,如果路由是 admin/* 而我没有登录,它会将我重定向到 /admin。关键是它必须这样做,即使路线存在与否...

您没有 post 您的 Kernel.php 文件,并且不清楚全局中间件的含义。您将其添加到 $middleware 数组还是 $middlewareGroups 数组?

这些中间件的顺序很重要。在 Kernel.php 文件中有三个数组,您可以在其中注册您的中间件。

  1. $middleware。随每个请求触发。

  2. $middlewareGroups。您注册一组中间件以分配给特定路由。它有两个主要组:webapiweb 组分配给在 routes/web.php 文件中注册的所有路由。

  3. $routeMiddleware。分配给特定路由的单个中间件。

我假设您首先将自定义中间件放在 $middleware 中以使其全局化,当这不起作用时您将 Laravel 的 StartSession 中间件添加到相同的大批。但是,StartSession 已经在 web 组的 $middlewareGroups 数组中注册。所以,你有两个会话,其中一个正在破坏另一个。

当所有路由需要会话(网络路由)时,向所有路由添加中间件的正确方法是将其添加到 web 组中,如果 $middlewareGroups StartSession 中间件之后。

例如,

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class, <---- Laravel session middleware
        // \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,

        \App\Http\Middleware\CustomMiddleware::class, <--- Your global middleware. 
    ],