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

Php Laravel-从服务提供商存储到会话中?,php,laravel,session,laravel-5,service-provider,Php,Laravel,Session,Laravel 5,Service Provider,我使用GeoIP包获取用户的IP并将其转换为zipcode。我不想对用户发出的每个请求都这样做,而是对zipcode执行一次性IP,将其存储到会话中,然后当我需要使用它时,只需检查会话中是否存在zipcode 我试着把代码放进去AppServiceProvider@boot但它不起作用。它不会在会话中被记住。我试过内部路线,但效果不好 编辑 appserviceprovider的引导方法中的代码。这只是一个测试 If (! Session()->has ('zipcode')) S

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

我试着把代码放进去AppServiceProvider@boot但它不起作用。它不会在会话中被记住。我试过内部路线,但效果不好

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

If (! Session()->has ('zipcode'))
    Session(['zipcode' => geocodeZipcode()]);
问题是,由于zipcode没有在会话中持久化,因此每次都会运行。到目前为止,从我的测试来看,if从来都不是假的

我需要将代码放在何处,以便将zipcode存储到会话中,并且即使用户未登录也能记住它

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


我应该将步骤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
实例

您可以向我们展示您为AppServiceProvider提供的代码吗?添加了测试代码。为什么不使用优秀的Laravel缓存机制呢?:。这是为您所描述的用例而设计的。好吧,这现在是有意义的。我会试试看这是否解决了我的问题。顺便说一句,我不知道我可以在中间件中进行类注入。谢谢,学了两件事。克里斯蒂安:如果答案是有用的,请考虑投票/接受它:所有的工作都很好。在我有时间测试它之前,我不想将它标记为已解决。非常感谢。