通常在 Agavi 中,您通过其setCookie方法在AgaviWebResponse对象上的AgaviView上设置 cookie。方法签名如下:
public function setCookie($name, $value, $lifetime = null, $path = null, $domain = null, $secure = null, $httponly = null)
这意味着,您可以使用以下语法设置一个简单的 cookie:
$this->getResponse()->setCookie('cookieName', $cookieValue);
如果您想要一个仅在一定时间内有效的 cookie,
您可以使用PHP 的 strtotime 函数为 cookie 设置一个易于阅读的生命周期:
$this->getResponse()->setCookie('cookieName', $cookieValue, '+14 days');
正如您的问题所述,您可能还想使用其他参数(域等)。阅读您的问题,您也可能希望设置多个 cookie,而不是一个由包含ID、ClickBannerId等的字符串组成的 cookie,但只有您和您的应用程序(或您的开发人员)可以说出来。
请注意,您可以为每个 cookie 设置附加参数,或者在每个环境的app/config/factories.xml文件中为您的应用程序配置一些合理的默认值(通常用于上下文_web_),以节省在视图中输入的时间:
<response class="AgaviWebResponse">
<ae:parameters name="cookie_httponly">true</ae:parameters>
</response>
有效的参数名称是:
- cookie_lifetime(以秒为单位的生命周期)
- cookie_path(cookie 应该可用的服务器上的路径)
- cookie_domain(cookie 可用的域)
- cookie_secure(如果 cookie 只能通过 HTTPS 使用,则将此设置为true )
- cookie_httponly(确定是否只允许通过 HTTP 而不是客户端脚本使用 cookie)
请注意,在较旧的 Agavi 版本中不需要ae命名空间,因此您可能需要使用parameter而不是ae:parameter。
要删除 cookie,您只需调用unsetCookie并使用与设置 cookie 相同的所有参数。要获取 cookie 值,只需调用getCookie($name)。由于 cookie 是不受信任的用户提供的信息,因此 Agavi 通常要求您验证所有传入的参数、文件、标题和 cookie,然后才能在您的操作和视图中访问它们。这意味着,您可能需要在访问其值之前验证您的 cookie。您可以通过validate.xml文件执行此操作:
<validator class="string" source="cookie" required="false">
<argument>cookieName</argument>
</validator>
此示例已简化,不应在生产中使用。使用source _cookie_ 和 cookie 的名称作为参数,然后根据您的规则(格式等)验证您的 cookie 值。如果内置AgaviValidator类(如字符串、正则表达式等)不够用,则可能需要编写自定义验证器,但这是另一天的话题。您可能会发现Agavi 用户常见问题解答有些帮助。对不起,无耻的插头,祝你手头的问题好运。:-)