首页 > 解决方案 > CakePHP 3 修改控制器中请求数据的正确方法

问题描述

SO上有很多关于这个的帖子,但似乎都过时了。

在 2019 年使用 CakePHP 3.7 并遵循有关实施“密码重置”电子邮件的教程:http://web.archive.org/web/20171001155555/http: //www.naidim.org/cakephp-3-tutorial-9-重设密码

该应用程序有一个users表,其中有 2 个字段,称为passkeytimeout。在上面链接的示例代码中,当用户重置密码时,他们使用以下内容“取消设置”这两个字段:

$this->request->data['passkey'] = null;
$this->request->data['timeout'] = null;

这似乎已被弃用,您不能再像这样在控制器中设置请求数据。

我的计划是尝试使用array_merge()来合并请求数据和我们想要修改的任何内容,如下所示:

$save_data = array_merge($this->request->getData(), ['passkey' => null, 'timeout' => null]);

// Note $user is the result of a find query done earlier.
$this->Users->patchEntity($user, $save_data);

这样做似乎对保存在数据库中的数据没有影响 - 它会更新密码字段(来自链接帖子上的表单)。但它不会修改数据库中的passkeyortimeout字段。

如果我debug($save_data)确实给了我一个数组:

[
    'password' => 'foo',
    'confirm_password' => 'foo',
    'passkey' => null,
    'timeout' = null
];

这是错误的方法吗?我相信这已经改变的原因是请求对象是不可变的,尽管$this->request像以前一样通过编程方式设置数据更容易。

标签: phpcakephp

解决方案


我不是 100% 确定我已经理解您的需求,但可以通过将链接代码重构到下面来确保在重置功能中重置密码和超时。这可能是一种方式...

// 原样

// Clear passkey and timeout
$this->request->data['passkey'] = null;
$this->request->data['timeout'] = null;
$user = $this->Users->patchEntity($user, $this->request->data);
if ($this->Users->save($user)) {
…

//到这个

$user = $this->Users->patchEntity($user, $this->request->getData());

// Clear passkey and timeout
$user->passkey = null;
$user->timeout = null;

if ($this->Users->save($user)) {
…

推荐阅读