ongr / cookies-bundle
使用cookie作为Symfony服务的Cookie模型
Requires
- php: >=5.5
- cocur/slugify: 0.2.2
- symfony/symfony: ~2.6|~3.0
Requires (Dev)
- phpunit/phpunit: ~4.4
- satooshi/php-coveralls: ~1.0
- squizlabs/php_codesniffer: ~2.0
This package is auto-updated.
Last update: 2024-08-25 06:56:36 UTC
README
Cookies bundle提供了使用cookie作为服务的Symfony方法。这允许更改服务的值,而bundle负责实际的cookie创建和更新。
安装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)
。其他所有模型值将被忽略。
组件
-
CookieModelListener
- 负责监听kernel.request
和kernel.response
事件的监听器; -
CookieInjector
- 执行繁重工作的服务(获取和设置cookie)。 -
Cookie Models
通过GenericCookie
类实现CookieInterface
。基本的cookie字段(域、过期等)位于CookieFieldsTrait
特质中。Cookie Models
负责将原始混合数据加载到漂亮的PHP对象中(实现是可定制的,并且可能因模型而异),并在需要时返回可cookie化的原始数据。
它如何工作?
-
Symfony收到一个请求。
kernel.request
事件被触发。CookieModelListener
正在监听。 -
CookieModelListener
的onKernelRequest
方法被调用,并传递GetResponseEvent
。onKernelRequest
调用CookieInjector
的inject
方法。 -
CookieInjector
遍历注册的Cookie 模型
,获取每个模型的原始数据,并调用Cookie 模型
的load
方法从 cookie 中加载数据。 -
现在我们有一个基于 cookie 的对象可用!
-
我们执行所需的所有操作,
-
Symfony 准备返回响应。触发
kernel.response
事件。再次,CookieModelListener
在监听。 -
CookieModelListener
的onKernelResponse
方法被调用,将FilterResponseEvent
传递给它。onKernelResponse
调用CookieInjector
的update
方法。 -
CookieInjector
遍历要发送到客户端的 cookie,"展开" 它们,然后遍历注册的Cookie 模型
,调用toCookie
方法以获取要存储在 cookie 中的数据。如果Cookie 模型
的clear
属性设置为 true,则清除 cookie,否则保存它。 -
我们的 cookie 要么保存并发送到用户的浏览器,要么从其中清除。
-
每个人都高兴。
Cookie 模型
的配置
Cookie 模型
被描述为任何其他 Symfony 服务,但有一个显著的区别:使用标签 ongr_cookie.cookie
来表示该服务是 Cookie 模型
。所有带有此标签的服务都将收集到一个单独的编译器过程中,并通过将其 addCookieModel
调用附加到其定义中,添加到 ongr_cookie.injector
服务。
cookie 服务的名称不应包含点符号 '.',并且必须与需要建模的 cookie 名称相同。
许可证
此包采用 MIT 许可证。请参阅包中的完整许可证 LICENSE
文件。