【问题标题】:Laravel Package cannot access sessionLaravel 包无法访问会话
【发布时间】:2016-02-26 08:44:50
【问题描述】:

我正在为 cms 系统开发 laravel 包。我最初在 laravel 5.1 中构建它并且工作正常,但现在我尝试在 5.2 上使用它并且遇到会话数据问题。

我面临的问题是,由于某种原因,我的包内的控制器无法访问会话数据。

使用 composer psr4 包含该包。

这是我的服务提供商加载我的包路由的启动方法:

// Include routes
if (!$this->app->routesAreCached()) {
    require __DIR__ . DIRECTORY_SEPARATOR . 'coreRoutes.php';
}

这是我正在测试的路线之一:

Route::get('manager', [
    'as' => 'manager',
    'uses' => 'Cms\Controllers\CmsController@administrationPanel',
]);

这是控制器内部的管理面板方法:

public function administrationPanel()
{
    var_dump(\Session::all());
    return view('Cms::front');
}

所以有了这个 var_dump,我得到了一个空数组。但是,如果我在其中一个应用程序控制器中使用 var_dump,我会得到一个填充数组。

有谁知道为什么包控制器无法访问普通应用控制器可以访问的会话数据?

我是否以错误的顺序加载内容?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    自 Laravel 5.2 起,StartSession 中间件已从全局 $middleware 列表移至 App\Http\Kernel.php 中的 web 中间件组。这意味着如果您需要对路由进行会话访问,您可以使用该中间件组。所以你的路由定义应该是这样的:

    Route::get('manager', [
        'middleware' => 'web',
        'as' => 'manager',
        'uses' => 'Cms\Controllers\CmsController@administrationPanel',
    ]);
    

    如果您不希望/不需要将所有其他中间件添加到该组(加密 cookie、CSRF 令牌验证等),您可以为会话设置一个简单的路由中间件,如下所示:

    protected $routeMiddleware = [
        ...
        'session' => \Illuminate\Session\Middleware\StartSession::class,
    ];
    

    有了这个,你可以使用session 而不是web 作为你的路由中间件。

    【讨论】:

    • 谢谢博格丹,简直不敢相信这就是我需要做的。花了几个小时试图弄清楚发生了什么。
    • 非常感谢这个答案。所以这就是为什么。
    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 2014-06-25
    • 2011-12-02
    • 2017-10-22
    • 1970-01-01
    相关资源
    最近更新 更多