我正在使用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。
答案 0 :(得分:0)
首先,CakePHP提供具有cookie身份验证的身份验证功能,您可能想看看它而不是开发自定义解决方案。
话虽这么说,您在这里所做的将创建一个cookie收集对象,但这仅仅是在空间中某处的一个孤立对象,它不会影响应用程序的状态,以免发生这种情况您必须实际修改响应对象。
但是,您首先要做的是不需要cookie收集,您可以直接通过request和response对象提供的方法直接读取和写入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()
方法创建自定义响应类,然后将字符串转换为整数(确保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()));
另请参见