Laravel cookie 自带加密,为什么?

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

Lio*_*han 5

Laravel 引导请求的序列是这样的 (v5.6): (CMIIW)

  1. index.php 叫做
  2. \Illuminate\Foundation\Application 创建
  3. HttpKernel挂号的。这将注册您的中间件
  4. Console Kernel挂号的。这定义了控制台命令
  5. Exception Handler挂号的。这定义了异常处理程序
  6. HttpKernel实例化。这会实例化所有中间件,以及启动/注册所有服务提供商
  7. 创建全局request实例。将它传递HttpKernel给处理传入的请求。
  8. EncryptCookies调用中间件,解密 cookie
  9. 发送request给其他中间件进行处理
  10. 发送request到路由器,路由器调度到控制器
  11. ...
  12. 响应发送到浏览器之前,饼干加密回来EncryptCookies

Cookie 在步骤 1 - 步骤 7 中保持加密状态。您CartServiceProvider正在尝试获取尚未在步骤 6 中解密的 cookie,这是不可能的。考虑

  1. 自己解密 cookie(仅使用decrypt),或

  2. 制作一个中间件来实例化购物车EncryptCookies。在引导服务提供者阶段实例化购物车还为时过早。


编辑:添加单例建议

我认为你可以这样做:

  1. 创建一个名为新方法,loadCartFromRequest($request)在你的Cart::class。此方法可帮助您在中间件阶段从请求加载购物车实例。

  2. 在您的 中CartServiceProvider,您Cart::class像往常一样注册了一个单例,但无需在此处阅读请求。

  3. 创建一个中间件,称为CartMiddleware. 这个中间件调用app(Cart::class)->loadCartFromRequest($request).

  4. 然后在您需要购物车实例的任何其他地方,您可以从 访问您的购物车模型app(Cart::class)

我希望我能正确理解您的要求:)