Session Laravel 5:课程没有按应有的方式进行

Session Laravel 5:课程没有按应有的方式进行,session,laravel,laravel-5,Session,Laravel,Laravel 5,在我使用的每个控制器和routes.php之上: use Illuminate\Support\Facades\Session; 在routes.php中,我使用以下方法设置会话: Session::put('key', 'value'); 在控制器中,我想使用以下方法调用键的会话值: echo Session::get('key'); 但是,一旦我在routes.php中将一个新值设置为key,并在控制器中调用它,我仍然会得到第一个值,而不是新值。如果在设置后使用routes.php中的

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

use Illuminate\Support\Facades\Session;
在routes.php中,我使用以下方法设置会话:

Session::put('key', 'value');
在控制器中,我想使用以下方法调用
键的会话值

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

Session::forget('key');
我忘了什么吗

使用常规PHP
$\u SESSION
my 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']);
            }
        }
    }
}
Session::put('key', 'value');

Route::get('my-route', 'MyController@doSomething');
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']);
            }
        }
    }
}
Session::put('key', 'value');

Route::get('my-route', 'MyController@doSomething');
然后这样做:

class MyController {
    public function doSomething()
    {
        Session::get('key');
    }
}
对吗?如果是这样,请继续阅读

我不是Laravel请求生命周期方面的专家(更多信息,请参见),但这不起作用并不奇怪。我的想法是这样的:
routes.php
文件在生命周期的早期加载并执行,可能是第一个,因为它告诉应用程序下一步要执行什么代码(即,当收到特定请求时该做什么)。当我说“生命周期的早期”时,我指的是早期,就像会话初始化之前一样。我认为,
Session::put
调用只是被忽略了,因为在设置值时,会话并不存在

你可能想用更多的细节来扩展你的问题,比如你想完成什么——必须有更好的方法来完成

编辑-回应以下评论

我不是说你应该触摸
$\u SESSION
超全局-这是个坏主意,因为我甚至不确定Laravel是否使用本机PHP SESSION工具,而且你也不能保证你所做的任何事情将来都会继续工作

不清楚您想做什么,但对我来说,这听起来像是一个不属于会话的值

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

如果是这样的话,它是一个静态值,那么它不是会话值,而是一个配置值

相反,如果它是一个动态值和/或根据与会话关联的用户而变化,则可以在以下几个位置之一设置它:

  • 如果您使用的是基于控制器的路由,可以在控制器构造函数中进行设置,尽管我不建议这样做,因为您可能需要对多个控制器进行设置,从而导致代码重复

  • 如果在路线中使用闭包,请将其设置在那里。例如

    Route::get('some/route', function () {
        Session::put('key', 'value');
        // this works, because the closure isn't executed until after
        // the application is initialized
    });
    
  • 你也可以在家里做

  • 或者在一个应用程序中(尽管我不确定在执行服务提供者时会话是否可用)

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

    路由中的何处。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']);
                }
            }
        }
    }
    
    Session::put('key', 'value');
    
    Route::get('my-route', 'MyController@doSomething');
    
    然后这样做:

    class MyController {
        public function doSomething()
        {
            Session::get('key');
        }
    }
    
    对吗?如果是这样,请继续阅读

    我不是Laravel请求生命周期方面的专家(更多信息,请参见),但这不起作用并不奇怪。我的想法是这样的:
    routes.php
    文件在生命周期的早期加载并执行,可能是第一个,因为它告诉应用程序下一步要执行什么代码(即,当收到特定请求时该做什么)。当我说“生命周期的早期”时,我指的是早期,就像会话初始化之前一样。我认为,
    Session::put
    调用只是被忽略了,因为在设置值时,会话并不存在

    你可能想用更多的细节来扩展你的问题,比如你想完成什么——必须有更好的方法来完成

    编辑-回应以下评论

    我不是说你应该触摸
    $\u SESSION
    超全局-这是个坏主意,因为我甚至不确定Laravel是否使用本机PHP SESSION工具,而且你也不能保证你所做的任何事情将来都会继续工作

    不清楚您想做什么,但对我来说,这听起来像是一个不属于会话的值

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

    如果是这样的话,它是一个静态值,那么它不是会话值,而是一个配置值

    相反,如果它是一个动态值和/或根据与会话关联的用户而变化,则可以在以下几个位置之一设置它:

  • 如果您使用的是基于控制器的路由,可以在控制器构造函数中进行设置,尽管我不建议这样做,因为您可能需要对多个控制器进行设置,从而导致代码重复

  • 如果在路线中使用闭包,请将其设置在那里。例如

    Route::get('some/route', function () {
        Session::put('key', 'value');
        // this works, because the closure isn't executed until after
        // the application is initialized
    });
    
  • 你也可以在家里做

  • 或者在一个应用程序中(尽管我不确定在执行服务提供者时会话是否可用)


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

    不要在laravel中使用
    $\u session
    。使用