Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePHP 3修改控制器中请求数据的正确方法_Php_Cakephp - Fatal编程技术网

CakePHP 3修改控制器中请求数据的正确方法

CakePHP 3修改控制器中请求数据的正确方法,php,cakephp,Php,Cakephp,关于这方面的帖子很多,但似乎都过时了 2019年使用CakePHP 3.7并遵循关于实施密码重置电子邮件的教程: 应用程序有一个users表,其中有两个字段,分别称为passkey和timeout。在上面链接的示例代码中,当用户重置密码时,他们使用以下方法来取消设置这两个字段: $this->request->data['passkey'] = null; $this->request->data['timeout'] = null; 这似乎已被弃用,您无法再像这样在控

关于这方面的帖子很多,但似乎都过时了

2019年使用CakePHP 3.7并遵循关于实施密码重置电子邮件的教程:

应用程序有一个users表,其中有两个字段,分别称为passkey和timeout。在上面链接的示例代码中,当用户重置密码时,他们使用以下方法来取消设置这两个字段:

$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);
这样做似乎对数据库中保存的数据没有影响-它将更新来自链接帖子上表单的密码字段。但它不会修改数据库中的密钥或超时字段

如果我调试$save_data,它是否确实为我提供了以下数组:

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

这样做不对吗?我相信改变的原因是请求对象是不可变的,虽然通过$this->request(如前所述)编程设置数据更容易。

我不能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)) {
…

听起来您的问题更像是如何为数据库列设置null!?您仍然可以使用withData和withoutData方法修改请求数据,但必须这样做往往表明您的应用程序设计存在问题。。。我想说的是,在那之后,你应该把注意力转移到零件上,即修补和保存数据。对于初学者,请检查修补后实体的外观,确保您的列实际上是可空的,并且您的模型缓存是最新的。感谢您的评论,但我并不真正理解。如果你看一下链接的例子,这个用例是非常清楚的。当用户请求重置密码时,它会写入用户表中的passkey和timeout字段,这很好。但当他们执行重置时,需要清除这些字段。因此,它们应该变为null,因为在重置发生后字段中不应该留下任何数据。为什么这是一个糟糕的应用程序设计?如果数据留在那里,这将是一个风险,因为你留下了一个可以用来重置密码的密钥。我不是说确认密码重置请求的概念有问题。这只是一个一般性的注意事项,您试图修改请求对象的事实可能表明您试图解决任务的方式有问题。例如,如果将内容转移到模型层,则可以使用专用于密码重置的自定义方法,甚至不接受其他数据,或者在model.beforeSave事件中,取消设置数据,这将保持请求对象不变,并保持应用程序干燥。至于可为空: