如何在多个函数中使用 CookieCollection
How to use a CookieCollection in multiple functions
我正在使用 cookie 设置网页以确定用户是否已经登录,使用包含用户 ID 的 cookie。问题是:cookie 未写入或 cookie 集合未更新。
我试过阅读文档,但它没有定义 CookieCollection 的用法。
这是我写 cookie 的函数:
function displayData(){
$id = $this->getRequest()->getSession()->read('id');
$cookies = CookieCollection::createFromServerRequest($this->getRequest());
if(!$cookies->has('id')){
$cookie = (new Cookie('id'))
->withValue($id)
->withExpiry(new DateTime('+999 year'))
->withPath('/')
->withDomain('break-first.eu')
->withSecure(true)
->withHttpOnly(true);
$cookies = $cookies->add($cookie);
}
// Other stuff
}
我尝试阅读它的地方:
function index(){
$cookies = $this->getRequest()->getCookieCollection();
dd($cookies);
}
我希望有一个名为 "id" 的 cookie,但我没有。只有 CAKEPHP 和 pll_language 出现了。
首先,CakePHP 提供了带有 cookie 身份验证的身份验证功能,您可能想看看它而不是驱动自定义解决方案。
话虽如此,您在那里所做的将创建一个 cookie 集合对象,但这只是 space 中某处的一个单独对象,它不会影响您的应用程序的状态,为了实现这一点,您必须实际修改响应对象。
但是,您在那里尝试做的事情一开始并不需要 cookie 集合,您可以直接通过请求和响应对象提供的方法简单地读写 cookie,例如:
// will be `null` in case the cookie doesn't exist
$cookie = $this->getRequest()->getCookie('id');
// responses are immutable, they need to be reassinged
this->setResponse(
$this->getResponse()->withCookie(
(new Cookie('id'))
->withValue($id)
->withExpiry(new DateTime('+999 year'))
->withPath('/')
->withDomain('break-first.eu')
->withSecure(true)
->withHttpOnly(true)
)
);
如果您出于任何原因在何处使用 cookie 集合,那么您将使用 withCookieCollection()
将其传递到响应中:
$this->setResponse($this->getResponse()->withCookieCollection($cookies));
如果您将 运行 转换为 strict typing errors,例如,您可以使用覆盖的 Response::convertCookieToArray()
方法创建自定义响应 class 并将字符串转换为整数(确保 PHP_INT_MAX
涵盖您的目标日期时间戳,32 位不兼容是 CakePHP 4.x 中的修复程序可能不会出现 3.x) 的原因,例如:
src/Http/Response.php
namespace App\Http;
use Cake\Http\Cookie\CookieInterface;
use Cake\Http\Response as CakeResponse;
class Response extends CakeResponse
{
protected function convertCookieToArray(CookieInterface $cookie)
{
$data = parent::convertCookieToArray($cookie);
$data['expire'] = (int)$data['expire'];
return $data;
}
}
您可以将其传递到 webroot/index.php
文件中的应用程序,作为 $server->run()
调用的第二个参数:
// ...
$server->emit($server->run(null, new \App\Http\Response()));
另见
我正在使用 cookie 设置网页以确定用户是否已经登录,使用包含用户 ID 的 cookie。问题是:cookie 未写入或 cookie 集合未更新。
我试过阅读文档,但它没有定义 CookieCollection 的用法。
这是我写 cookie 的函数:
function displayData(){
$id = $this->getRequest()->getSession()->read('id');
$cookies = CookieCollection::createFromServerRequest($this->getRequest());
if(!$cookies->has('id')){
$cookie = (new Cookie('id'))
->withValue($id)
->withExpiry(new DateTime('+999 year'))
->withPath('/')
->withDomain('break-first.eu')
->withSecure(true)
->withHttpOnly(true);
$cookies = $cookies->add($cookie);
}
// Other stuff
}
我尝试阅读它的地方:
function index(){
$cookies = $this->getRequest()->getCookieCollection();
dd($cookies);
}
我希望有一个名为 "id" 的 cookie,但我没有。只有 CAKEPHP 和 pll_language 出现了。
首先,CakePHP 提供了带有 cookie 身份验证的身份验证功能,您可能想看看它而不是驱动自定义解决方案。
话虽如此,您在那里所做的将创建一个 cookie 集合对象,但这只是 space 中某处的一个单独对象,它不会影响您的应用程序的状态,为了实现这一点,您必须实际修改响应对象。
但是,您在那里尝试做的事情一开始并不需要 cookie 集合,您可以直接通过请求和响应对象提供的方法简单地读写 cookie,例如:
// will be `null` in case the cookie doesn't exist
$cookie = $this->getRequest()->getCookie('id');
// responses are immutable, they need to be reassinged
this->setResponse(
$this->getResponse()->withCookie(
(new Cookie('id'))
->withValue($id)
->withExpiry(new DateTime('+999 year'))
->withPath('/')
->withDomain('break-first.eu')
->withSecure(true)
->withHttpOnly(true)
)
);
如果您出于任何原因在何处使用 cookie 集合,那么您将使用 withCookieCollection()
将其传递到响应中:
$this->setResponse($this->getResponse()->withCookieCollection($cookies));
如果您将 运行 转换为 strict typing errors,例如,您可以使用覆盖的 Response::convertCookieToArray()
方法创建自定义响应 class 并将字符串转换为整数(确保 PHP_INT_MAX
涵盖您的目标日期时间戳,32 位不兼容是 CakePHP 4.x 中的修复程序可能不会出现 3.x) 的原因,例如:
src/Http/Response.php
namespace App\Http;
use Cake\Http\Cookie\CookieInterface;
use Cake\Http\Response as CakeResponse;
class Response extends CakeResponse
{
protected function convertCookieToArray(CookieInterface $cookie)
{
$data = parent::convertCookieToArray($cookie);
$data['expire'] = (int)$data['expire'];
return $data;
}
}
您可以将其传递到 webroot/index.php
文件中的应用程序,作为 $server->run()
调用的第二个参数:
// ...
$server->emit($server->run(null, new \App\Http\Response()));
另见