我正在使用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
实例