Laravel中未设置会话变量

时间:2017-11-18 23:20:06

标签: php laravel session redirect middleware

大家。

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

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

但另一个错误出现了。由于我打了'\ Illuminate \ Session \ Middleware \ StartSession :: class'中间件,我的重定向不再对会话变量。

到目前为止,下面的代码工作正常,重定向在会话上创建了arsh变量:

return redirect('/admin')->with('arsh', $arsh);

但现在不再在重定向的会话上放置arsh变量了。

我在互联网上研究了很多,但没有。我看到很多建议,但没有人工作。

我只是不知道自己能做些什么。如果你知道什么会很棒。

你也可以考虑在我的中间件中使用另一种解决方法来阅读会话,并且可能不再需要考虑上一个bug了。

我希望你理解我写的内容并对我的英语表示抱歉。

编辑:

我做了哈姆德所说的话: 我将我的中间件(\ 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',
    ],
];

现在重定向效果很好,可以在会话中设置变量。但我的中间件不再起作用了:

<?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。所以当我的网址类似于domain.com/admin/fgtsdr时,我会重定向到404。

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

1 个答案:

答案 0 :(得分:2)

您没有发布您的Kernel.php文件,并且不清楚全球中间件的含义是什么。你是在添加$middleware数组还是$middlewareGroups数组?

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

  1. $middleware。每次请求都会触发。

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

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

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

    在需要会话(网络路由)的情况下,将中间件添加到所有路由的正确方法是,如果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. 
        ],