Laravel 5:会话不按预期方式工作

时间:2015-11-24 13:50:06

标签: session laravel laravel-5

在我使用的每个控制器和routes.php之上:

use Illuminate\Support\Facades\Session;

在routes.php中,我使用以下方式设置会话:

Session::put('key', 'value');

在控制器中,我想使用:

调用key的会话值
echo Session::get('key');

但是一旦我在routes.php中将一个新值设置为key并在控制器中调用它,我仍然得到第一个值而不是新值。如果我在设置之后使用routes.php中的Session::all()回显会话,我会看到新值,但在控制器中它会翻转回第一个值。我甚至尝试在设置新值之前在routes.php中使用以下内容,但没有成功。

Session::forget('key');

我忘记了什么吗?

使用常规PHP $_SESSION我的routes.php如下所示:

$slug = $_SERVER['REQUEST_URI'];
$slug = explode('/', $slug[0]);

if(in_array($slug[1], Language::all()->lists('iso'))) {
    $_SESSION['language'] = $slug[1];
    if(!$slug[2]) {
        $_SESSION['slug'] = 'home';
        Route::any('/{slug}', ['as' => 'pages.page', 'uses' => 'PagesController@page']);
    } else {
        if($slug[2] != 'dashboard' && $slug[2] != 'migrate' && $slug[2] != 'form-send') {
            if (in_array($slug[2], ElementValue::where('element_field_id', 2)->lists('value_char')) && !isset($slug[3])) {
                $_SESSION['slug'] = $slug[2];
                Route::any('/{slug}', ['as' => 'pages.page', 'uses' => 'PagesController@page']);
            } else {
                $_SESSION['slug'] = 'home';
                Route::any('/{slug}', ['as' => 'pages.page', 'uses' => 'PagesController@page']);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:3)

routes.php中的在哪里设置会话值?听起来你正在做这样的事情:

Session::put('key', 'value');

Route::get('my-route', 'MyController@doSomething');

然后这样做:

class MyController {
    public function doSomething()
    {
        Session::get('key');
    }
}

这是对的吗?如果是这样,请继续阅读......

我不是Laravel请求生命周期的专家(更多,see the documentation),但我并不感到惊讶,这不起作用。我想到的方式是:routes.php文件在生命周期的早期加载和执行 - 可能是第一个 - 因为它告诉应用程序接下来要执行什么代码(即,什么时候收到特定请求) )。当我在生命周期的早期说'#34;,我的意思是早期 - 就像会话初始化之前一样。我认为Session::put电话被忽略了,因为在您设置值时,会话不存在。

您可能希望通过更详细地了解您正在尝试完成的内容来扩展您的问题 - 必须有更好的方法来实现这一目标。

编辑 - 回应以下评论......

说你应该触摸$_SESSION超全球 - 这是一个坏主意,因为我甚至不确定Laravel 是否使用原生PHP会话设施,您无法保证您将来继续工作。

我不清楚你要做什么,但对我而言,这听起来像是一个不属于会话的价值。

Session::put放在routes.php文件中,听起来您有一些重要的价值,应该为每个会话和每个请求设置

如果是这种情况,并且它是静态值,那么它不是会话值,而是配置值。

相反,如果它是一个动态值和/或它会根据哪个用户与某个会话相关联而发生变化,那么您可以将其设置为以下几个位置之一:

  1. 如果你正在使用基于控制器的路由,你可以在控制器构造函数中设置它,虽然我不推荐它,因为你可能不得不为多个控制器执行此操作,导致代码重复

  2. 如果您在路线中使用闭包,请将其设置在那里。 E.g。

    Route::get('some/route', function () {
        Session::put('key', 'value');
        // this works, because the closure isn't executed until after
        // the application is initialized
    });
    
  3. 您也可以在middleware

  4. 中执行此操作
  5. service provider(虽然我不确定在执行服务提供商时会话是否可用)。

  6. 最好的选择可能是中间件 - 这将允许您在代码中的一个位置设置(或计算)会话值,并将其与特定路由关联,如果您不需要所有路由。

答案 1 :(得分:1)

请勿在laravel中使用$_SESSION。使用laravel Session类。请参阅以下帖子How to access the globals $_SESSION and $_COOKIE from a laravel app?

此外,所有if逻辑都不应该存在routes.php中。您应该将其添加到中间件以过滤您的路由。

另外,你真的为自己做了这件事。 Laravel在方便的帮助程序类中提供了您所需的大部分内容,例如: Request::url()Request::getHost()Request::getLocale()。阅读文档并熟悉“Laravel Way”,它将变得更加容易,然后事情将按照您的预期运作。

答案 2 :(得分:0)

我将逻辑移到了控制器,现在我的路线很简单:

Route::pattern('slug', '[a-zA-Z0-9\-_\/]+');
$slug = Request::path();
if(isset($slug)) {
    Route::any('/{slug}', 'PagesController@index')->where('slug', '[a-zA-Z0-9\-_\/]+');
}

会话存储在PagesController中,并在应用程序中进一步使用。谢谢你的帮助。