Ale*_*pov 0 php laravel laravel-5.5
我得到了以下服务提供商:
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']);
});
}
}
Run Code Online (Sandbox Code Playgroud)
还有我的 Cart 课,我在那里得到了这个:
$this->id = (request()->cookie('cart_id')) ? request()->cookie('cart_id') : false;
Run Code Online (Sandbox Code Playgroud)
但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调用中间件,解密 cookierequest给其他中间件进行处理request到路由器,路由器调度到控制器EncryptCookiesCookie 在步骤 1 - 步骤 7 中保持加密状态。您CartServiceProvider正在尝试获取尚未在步骤 6 中解密的 cookie,这是不可能的。考虑
自己解密 cookie(仅使用decrypt),或
制作一个中间件来实例化购物车EncryptCookies。在引导服务提供者阶段实例化购物车还为时过早。
编辑:添加单例建议
我认为你可以这样做:
创建一个名为新方法,loadCartFromRequest($request)在你的Cart::class。此方法可帮助您在中间件阶段从请求加载购物车实例。
在您的 中CartServiceProvider,您Cart::class像往常一样注册了一个单例,但无需在此处阅读请求。
创建一个中间件,称为CartMiddleware. 这个中间件调用app(Cart::class)->loadCartFromRequest($request).
然后在您需要购物车实例的任何其他地方,您可以从 访问您的购物车模型app(Cart::class)。
我希望我能正确理解您的要求:)
| 归档时间: |
|
| 查看次数: |
1977 次 |
| 最近记录: |