Laravel cookies带有加密功能,为什么?

问题描述 投票:0回答:2

我有以下服务提供商:

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

php laravel laravel-5.5
2个回答
1
投票

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. 在向浏览器发送响应之前,cookie已在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)访问您的购物车模型。

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


1
投票

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

How:Laravel使用EncryptCookies中间件,当您的服务提供商注册时,该中间件尚未被处理,但由于中间件在请求传递给控制器​​之前位于路由堆栈中,因此将为控制器进行处理。

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

© www.soinside.com 2019 - 2024. All rights reserved.