gpt4 book ai didi

CakePHP 4.1.4 - 如何在新版本的 CakePHP 中创建、读取和检查 cookie

转载 作者:行者123 更新时间:2023-12-02 02:38:21 25 4
gpt4 key购买 nike

在 CakePHP 3.8 中,我的 Controller 部分如下所示:

// ...  

public function beforeFilter(Event $event)
{
// ...

$this->Cookie->configKey('guestCookie', [
'expires' => '+1 days',
'httpOnly' => true,
'encryption' => false
]);

if(!$this->Cookie->check('guestCookie')) {
$guestID = Text::uuid();
$this->Cookie->write('guestCookie', $guestID);
}

$this->guestCookie = $this->Cookie->read('guestCookie');

// ...
}


public function error()
{
// ...
$this->Cookie->delete('guestCookie');
// ...
}

// ...

如何在CakePHP4版本中写同样的东西?我的问题与定义 Cookies 有关。此处描述了 Cookie 设置: https://book.cakephp.org/4/en/controllers/request-response.html#cookie-collections,但不幸的是,这对我没有任何帮助。

我试过这样解决问题:

    public function beforeFilter(EventInterface $event)
{
//...

if(!$this->cookies->has('guestCookie')) {
$cookie = (new Cookie('guestCookie'))->withValue(Text::uuid())->withExpiry(new \DateTime('+20 days'))->withPath('/')->withSecure(false)->withHttpOnly(true);
$this->cookies = new CookieCollection([$cookie]);
}

$this->guestCookie = $this->cookies->get('guestCookie')->getValue();
//...
}

在我的例子中,$ this->cookies->has('guestCookie') 总是'false'。cookie 值永远不会存储在浏览器中。请帮忙。

最佳答案

很少需要接触 cookie 集合,大多数情况下,您只需要简单地从请求对象中读取 cookie 值,然后将 cookie 写入响应对象即可,因此我建议您坚持这样做,直到实际需要收集。

文档在解释何时使用什么方面可能会做得更好。

读取、写入和删除 cookie

如链接文档所示,可以通过以下方式读取 cookie 值:

$this->request->getCookie($cookieName)

并通过以下方式编写:

$this->response = $this->response->withCookie($cookieObject)

重新分配响应对象很重要(除非您直接从 Controller 返回它),因为它是不可变的,这意味着 withCookie() 将返回一个新的响应对象而不是修改当前对象。

删除 cookie 可以通过使用过期 cookie 响应、使用 withExpiredCookie() 而不是 withCookie() 或通过 获取 cookie 的过期版本来完成>$cookie->withExpired() 并将其传递给 withCookie()

配置 cookie 默认值

如果您愿意,可以通过 Cookie::setDefaults() 设置 cookie 默认值:

\Cake\Cookie\Cookie::setDefaults([
'expires' => new DateTime('+1 days'),
'http' => true,
]);

然而,这将在整个应用程序范围内应用于此时之后创建的所有 cookie 实例,因此您可能很少使用它,如果您这样做,请小心使用!

从 Cookie 组件移植

使用新的 API,您的代码可以这样写,$this->guestCookie 保存 cookie 值,可以是新生成的值,也可以是从您收到的 cookie 中获得的值应用:

use Cake\Http\Cookie\Cookie;

// ...

public function beforeFilter(Event $event)
{
// ...
$guestID = $this->request->getCookie('guestCookie');
if(!$guestID) {
$guestID = Text::uuid();

$cookie = Cookie::create('guestCookie', $guestID, [
'expires' => new DateTime('+1 days'),
'http' => true,
]);
$this->response = $this->response->withCookie($cookie);
}

$this->guestCookie = $guestID;
// ...
}

public function error()
{
// ...
$cookie = new Cookie('guestCookie');
$this->response = $this->response->withExpiredCookie($cookie);
// ...
}

// ...

另见

关于CakePHP 4.1.4 - 如何在新版本的 CakePHP 中创建、读取和检查 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63995554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com