Как использовать CookieCollection в нескольких функциях - PullRequest
0 голосов
/ 26 июня 2019

Я настраиваю веб-страницу, используя куки, чтобы определить, вошел ли пользователь в систему, используя куки, содержащие его идентификатор. Проблема: файл cookie либо не записан, либо коллекция файлов cookie не обновлена.

Я попытался прочитать документацию, но она не определяет использование CookieCollection.

Вот функция, где я пишу свое печенье:

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);
    }

Я ожидаю, что у меня есть cookie с именем "id", но у меня его нет. Отображаются только CAKEPHP и pll_language.

1 Ответ

0 голосов
/ 26 июня 2019

Перво-наперво, 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()));

Смотри также

...