CakePHP 3 - 奇怪的行为 $this->set();设置后受影响

Posted

技术标签:

【中文标题】CakePHP 3 - 奇怪的行为 $this->set();设置后受影响【英文标题】:CakePHP 3 - Strange behavior $this->set(); affected after setting 【发布时间】:2016-02-02 09:34:15 【问题描述】:

今天我发现自己在 Cakephp 中有一个奇怪的行为。

我想要存档的是更新数据库中的列以反映上次查看的日期。当使用与标准时间戳事件(如创建、修改等)不同的列时,可以使用“touch()”来完成此操作。

我想要什么:我想在 页面。 发生了什么:当前日期时间戳显示在 页面。

我在这里看到的奇怪行为是:在我将实体设置为视图变量并更新触摸“上次查看”日期后,设置的视图变量中的数据反映了这种变化。

设置实体到视图的代码:

// get the request entity with the ID:
$request = $this->Requests->get($request_id);

// set the entity to the $request view variable:
$this->set('request', $request);

// finally update the last viewed date (database column name: 'opened'):
$this->Requests->touch($request, 'Requests.opened');
$this->Requests->save($request);

为什么$request视图变量会反映设置变量后执行的触摸变化?

【问题讨论】:

【参考方案1】:

来自manual

从 PHP 5 开始,对象变量不包含对象本身 值了。它只包含一个对象标识符,它允许 对象访问器来查找实际对象

为了达到你想要的,你应该做的

// set the entity to the $request view variable:
$this->set('request', clone $request);

但也许可以考虑将之前的“最后查看”日期而不是整个克隆实体传递给视图

【讨论】:

我需要整个请求实体,所以理论上应该没问题。我现在要测试它,感谢您的回复:) - 您的答案似乎有效!非常感谢。

以上是关于CakePHP 3 - 奇怪的行为 $this->set();设置后受影响的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 奇怪的 saveAll 问题。返回 true,但在数据库中没有任何内容

从Cakephp树中移除分支(树行为)

CakePHP 3 Auth注销 - 错误:未找到身份验证适配器“loginAction”

通过 '*this' 传递副本时的奇怪行为

Cakephp分页问题

CakePHP 3 - 保存前的数据关联