我有以下服务提供商:
class CartServiceProvider extends ServiceProvider {
public function boot() {
}
public function register() {
$this->app->singleton(\Alexxosipov\Cart\Cart::class, function($app) {
return new \Alexxosipov\Cart\Cart($app['request']);
});
}
}
我的推车课,我得到了这个:
$this->id = (request()->cookie('cart_id')) ? request()->cookie('cart_id') : false;
但request()->cookie('cart_id')
返回加密字符串。如果我将在任何控制器中执行它,它工作正常。为什么?我应该怎么做才能在Cart类中使用它?Laravel 5.5
Laravel引导请求的顺序是这个(v5.6):( CMIIW)
index.php
被称为\Illuminate\Foundation\Application
创建HttpKernel
注册。这会注册您的中间件Console Kernel
注册。这定义了控制台命令Exception Handler
注册。这定义了异常处理程序HttpKernel
实例化。这会实例化所有中间件,并启动/注册所有服务提供商request
实例。将它传递给HttpKernel
来处理传入的请求。EncryptCookies
呼叫,cookie解密request
发送到其他中间件进行处理request
发送到路由器,将路由器发送到控制器EncryptCookies
中加密Cookie在步骤1 - 步骤7中保持加密状态。您的CartServiceProvider
正在尝试获取尚未在步骤6解密的cookie,这是不可能的。考虑一下
decrypt
),或EncryptCookies
之后制作一个中间件来实例化购物车。在引导服务提供商阶段实例化购物车有点太早了。编辑:添加单例建议
我想你可以这样做:
loadCartFromRequest($request)
中创建一个名为Cart::class
的新方法。此方法可帮助您在中间件阶段从请求加载购物车实例。CartServiceProvider
中,你像往常一样注册一个Cart::class
单身,但不需要在这里阅读请求。CartMiddleware
的中间件。这个中间件调用app(Cart::class)->loadCartFromRequest($request)
。app(Cart::class)
访问您的购物车模型。我希望我能正确理解你的要求:)
为什么? Cookie加密可保护客户端浏览器中存储的数据。
How:Laravel使用EncryptCookies中间件,当您的服务提供商注册时,该中间件尚未被处理,但由于中间件在请求传递给控制器之前位于路由堆栈中,因此将为控制器进行处理。
由于我不了解您的购物车类及其逻辑,我不能真正推荐您应该做什么。也许您需要考虑何时将Request对象传递给您的类。