如何在多种功能中使用CookieCollection

时间:2019-06-26 14:09:44

标签: cakephp cookies cakephp-3.7

我正在使用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。

1 个答案:

答案 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()));

另请参见