Перво-наперво, CakePHP обеспечивает аутентификацию с помощью куки-аутентификации, вы можете захотеть взглянуть на это, вместо того, чтобы предлагать собственное решение.
Тем не менее, то, что вы делаете там, создаст объект коллекции cookie, который, тем не менее, представляет собой одинокий объект где-то в пространстве, он не повлияет на состояние вашего приложения, чтобы это произошло Вы должны фактически изменить объект ответа.
Однако то, что вы пытаетесь сделать, не требует в первую очередь коллекций файлов 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));
Если вы столкнетесь с строгими ошибками ввода , вы можете, например, создать пользовательский класс ответа с переопределенным методом Response::convertCookieToArray()
и привести туда целое число (убедитесь, что что PHP_INT_MAX
покрывает вашу целевую отметку времени даты, 32-битная несовместимость - вот почему исправление, появившееся в CakePHP 4.x, вероятно, не доходит до 3.x), что-то вроде:
ЦСИ / 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()));
Смотри также