ongr/cookies-bundle

使用cookie作为Symfony服务的Cookie模型

安装次数: 26 211

依赖项: 1

建议者: 0

安全性: 0

星级: 4

关注者: 21

分支: 11

开放问题: 2

类型:symfony-bundle

v1.0.0 2016-06-06 08:42 UTC

This package is auto-updated.

Last update: 2024-08-25 06:56:36 UTC


README

Cookies bundle提供了使用cookie作为服务的Symfony方法。这允许更改服务的值,而bundle负责实际的cookie创建和更新。

Build Status Coverage Status Latest Stable Version Scrutinizer Code Quality

安装bundle

要安装此bundle,请将其添加到composer。

   composer require ongr/cookies-bundle

然后在AppKernel.php中注册它

   class AppKernel extends Kernel
   {
       public function registerBundles()
       {
           return [
               // ...
               new ONGR\CookiesBundle\ONGRCookiesBundle(),
           ];
       }

       // ...
   }

这就完成了 - bundle已经准备好工作。

处理cookies

如何定义cookie模型

ONGR提供了用于在请求和响应中处理cookie值的cookie模型抽象。

可以定义一个服务

    parameters:
        project.cookie.foo.name: cookie_foo
        project.cookie.foo.defaults: # Defaults section is optional
            http_only: false
            expires_interval: P5DT4H # 5 days and 4 hours

    services:
        project.cookie.foo:
            class: %ongr_cookie.json.class%
            arguments: [ %project.cookie.foo.name% ]
            calls:
                - [setDefaults, [%project.cookie.foo.defaults%]] # Optional
            tags:
                - { name: ongr_cookie.cookie }

注意 cookie服务的名称不应包含点符号'.',且必须与需要建模的cookie名称相同。

此类注入的服务允许访问cookie值。如果值已被您的代码修改,它将向客户端浏览器发送新值。使用ONGR Cookies Bundle操作cookie值非常简单:您需要获取cookie模型服务,然后可以使用getValue()方法获取cookie值,并使用setValue(mixed $value)方法设置值。

    class CookieController
    {
        use ContainerAwareTrait;

        public function updateAction()
        {
            /** @var JsonCookie $cookie */
            $cookie = $this->container->get('project.cookie.foo');
            $cookie->setValue(['bar']);
            // Cookie has been marked as dirty and will be updated in the response.
            $cookie->setExpiresTime(2000000000);

            return new JsonResponse();
        }
    }

默认值

setDefaults可能的键(未指定时的默认值)

  • domain - 字符串 (null)

  • path - 字符串 ('/')

  • http_only - 布尔值 (true)

  • secure - 布尔值 (false)

  • expires_time - 整数 (0)

  • expires_interval - DateInterval 字符串 (null)

这些值用于初始化cookie模型,如果cookie不存在于客户端的浏览器中。

模型类型

目前,可以使用以下预配置的类

  • %ongr_cookie.json.class% - 可以像PHP数组一样处理其值。在后台,值使用JSON格式进行编码和解码。

  • %ongr_cookie.generic.class%处理纯字符串数据。可以通过扩展此类创建其他cookie格式。

手动设置cookie

如果将具有相同名称、路径和域的cookie添加到响应对象中,则其值不会被更改的cookie模型数据覆盖。

删除cookie

要从客户端浏览器中删除cookie,请使用$cookie->setClear(true)。其他所有模型值将被忽略。

组件

  1. CookieModelListener - 负责监听kernel.requestkernel.response事件的监听器;

  2. CookieInjector - 执行繁重工作的服务(获取和设置cookie)。

  3. Cookie Models通过GenericCookie类实现CookieInterface。基本的cookie字段(域、过期等)位于CookieFieldsTrait特质中。Cookie Models负责将原始混合数据加载到漂亮的PHP对象中(实现是可定制的,并且可能因模型而异),并在需要时返回可cookie化的原始数据。

它如何工作?

  1. Symfony收到一个请求。kernel.request事件被触发。CookieModelListener正在监听。

  2. CookieModelListeneronKernelRequest方法被调用,并传递GetResponseEventonKernelRequest调用CookieInjectorinject方法。

  3. CookieInjector 遍历注册的 Cookie 模型,获取每个模型的原始数据,并调用 Cookie 模型load 方法从 cookie 中加载数据。

  4. 现在我们有一个基于 cookie 的对象可用!

  5. 我们执行所需的所有操作,

  6. Symfony 准备返回响应。触发 kernel.response 事件。再次,CookieModelListener 在监听。

  7. CookieModelListeneronKernelResponse 方法被调用,将 FilterResponseEvent 传递给它。onKernelResponse 调用 CookieInjectorupdate 方法。

  8. CookieInjector 遍历要发送到客户端的 cookie,"展开" 它们,然后遍历注册的 Cookie 模型,调用 toCookie 方法以获取要存储在 cookie 中的数据。如果 Cookie 模型clear 属性设置为 true,则清除 cookie,否则保存它。

  9. 我们的 cookie 要么保存并发送到用户的浏览器,要么从其中清除。

  10. 每个人都高兴。

Cookie 模型 的配置

Cookie 模型 被描述为任何其他 Symfony 服务,但有一个显著的区别:使用标签 ongr_cookie.cookie 来表示该服务是 Cookie 模型。所有带有此标签的服务都将收集到一个单独的编译器过程中,并通过将其 addCookieModel 调用附加到其定义中,添加到 ongr_cookie.injector 服务。

cookie 服务的名称不应包含点符号 '.',并且必须与需要建模的 cookie 名称相同。

许可证

此包采用 MIT 许可证。请参阅包中的完整许可证 LICENSE 文件。