Laravel-从服务提供商存储到会话中


Laravel - storing into session from service provider?

我正在使用GeoIP包来获取用户的IP并将其转换为邮政编码。我不想对用户提出的每个请求都这样做,而是做一次IP到邮政编码,将其存储到会话中,然后当我需要使用它时,只需检查会话中是否存在邮政编码。

我试着把代码放在里面AppServiceProvider@boot但它不起作用。它不会在会话中被记住。我试过内线,但没有成功。

编辑
appserviceprovider的引导方法中的代码。这只是一个测试。

If (! Session()->has ('zipcode'))
    Session(['zipcode' => geocodeZipcode()]);

问题是,由于zipcode没有在会话中持久化,所以每次都会运行。到目前为止,从我的测试来看,if从来都不是假的。

我需要把代码放在哪里,以便将zipcode存储到会话中,并在用户没有登录的情况下记住它?

我基本上需要这样的东西:
1-用户第一次访问服务器上的页面(任何页面)
2-我获取用户IP并将其翻译为邮政编码
3-我将邮政编码存储到会话中
4-对于用户发出的每一个其他请求,我都会检查会话中是否存在邮政编码。如果没有,我执行步骤2。
5-使用邮政编码的目的

我应该把第2步和第3步放在哪里?

在Laravel中,会话通过中间件初始化,所有中间件在服务提供商启动阶段后执行

这就是为什么在你的服务提供商中你不能访问会话的原因:它还没有初始化

您应该将步骤2和3放在中间件中:

class ZipCodeMiddleware
{
    public function handle( Request $request, Closure $next )
    {
        //ZIP CODE NOT FOUND IN SESSION: CREATE IT AND STORE
        if ( ! Session::has( 'zipcode' ) )
        {
            //get ip and translate to zip     
            //store zip in the session
        }    
        //use zip code here or access it later from Session
        return $next($request);
    }
}

一旦你在会话中存储了邮政编码,你就可以直接从会话中的控制器访问它,或者,你可以在中间件中实例化一个类,然后用重新访问它

 //use zip code here or access it later from Session
 $zipClass = new ZipClass( $zipCode );
 App::instance( ZipClass::class, $zipClass );

通过这种方式,您可以在控制器中自动注入ZipClass依赖性,Laravel将返回您之前在中间件中构建的$zipClass实例