Laravel cookie自带加密,为什么?

Laravel cookies comes with encryption, why?

我得到了以下服务提供商:

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']);
        });
    }
}

还有我的购物车 class,我从哪里得到的:

$this->id = (request()->cookie('cart_id')) ? request()->cookie('cart_id') : false;

但是request()->cookie('cart_id')returns加密字符串。如果我在任何控制器中执行此操作,它都可以正常工作。为什么?我应该怎么做才能在购物车中使用它 class?Laravel 5.5

为什么? Cookie 加密保护存储在客户端浏览器中的数据。

如何: Laravel 使用 EncryptCookies 中间件,此中间件在您的服务提供商注册时尚未处理,但会为控制器处理,因为中间件在请求传递给控制器​​之前在路由堆栈中。

由于我不了解您的购物车 class 及其逻辑,因此我无法真正推荐您应该做什么。也许您需要考虑何时将 Request 对象传递给 class.

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

  1. index.php被称为
  2. \Illuminate\Foundation\Application 创建
  3. HttpKernel 已注册。这会注册您的中间件
  4. Console Kernel 已注册。这定义了控制台命令
  5. Exception Handler 已注册。这定义了异常处理程序
  6. HttpKernel 已实例化。这会实例化所有中间件,加上 boot/register 所有服务提供商
  7. 创建全局 request 实例。将其传递给 HttpKernel 以处理传入请求。
  8. 中间件 EncryptCookies 调用,cookie 解密
  9. 发送request给其他中间件处理
  10. 发送request到路由器,路由器发送到控制器
  11. ...
  12. 在向浏览器发送响应之前,在 EncryptCookies
  13. cookie 加密回

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

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

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


编辑:添加单例建议

我认为你可以这样做:

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

  2. 在你的CartServiceProvider中,你像往常一样注册了一个Cart::class的单例,但不需要在这里阅读请求。

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

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

  5. 访问您的购物车模型

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