如何在多个函数中使用 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()));

另见