CakePHP 数据在验证期间发生更改,并且 beforeSave 未随更改一起保存
Posted
技术标签:
【中文标题】CakePHP 数据在验证期间发生更改,并且 beforeSave 未随更改一起保存【英文标题】:CakePHP data change during validation and beforeSave is not being save with the changes 【发布时间】:2013-09-15 17:45:16 【问题描述】:我正在保存从表单发送的数据。
在我正在做的控制器中:
$this->User->create();
$this->User->save($this->request->data)
$this->request->数据如下所示:
'User' => array(
'password' => '*****',
'username' => 'ddddd',
'role' => '256/aa01bdf80d42beb48dd3225acddf447fdd7a39f3',
'parent_id' => '0/b6ba9bd57f6c70cf738891d4c6fac22abed4161d'
)
存在适用于“角色”和“父 ID”的验证规则,以确保角色/父 ID 在用户可以访问的范围内。
如果数据有效,验证会更改字段值。
我还有一个 Tree 行为,它在行为的 beforeSave() 过滤器中设置一些树字段。
验证规则正在将更改写入$this->data->[$model][$field]
,如下所示。
public function checkListHash($check, $field)
$explodedCheck = explode('/', $check[$field]);
if ($this->secureId($explodedCheck[0], $explodedCheck[1]))
$this->data['User'][$field] = $explodedCheck[0];
return true;
return false;
行为中的 beforeFilter() 正在使用如下语句更改数据数组:
$Model->data[$Model->alias][$ancestors] = $ancestorList;
验证和 beforeFilter() 处理完成后,我在$this->User->data
有一个漂亮且正确的数据数组,如下所示:
'User' => array(
'password' => '*****',
'active' => '0',
'role' => '256',
'parent_id' => '0',
'node' => '0',
'username' => 'ddddd',
'modified' => '2013-09-15 09:55:02',
'created' => '2013-09-15 09:55:02',
'ancestor_list' => ',0,'
)
但是,$this->request->data
没有改变。这就是正在保存的内容。
显然,我不了解这些获取数据的各种方式之间的关系。我尝试了多种方法来处理三种上下文中的数据:
控制器 型号 行为我已经在 Controller save() 语句之前尝试了$this->User->create($this->request->data);
。
在控制器中,我看到的可用数据数组:
保存前 $this->request->data = $this->data = 表单中的正确数据$this->User->data = 一些默认的、未填充的数组
在我使用 $this->User->create($this->request->data) 时保存之前
所有三个数组都包含原始表单数据
在任一情况下保存后
$this->request->data = $this->data = 和以前一样 $this->User->data = 正确处理的数据谁能帮我解决?
唐·德雷克
【问题讨论】:
数据不是通过引用(模型)传递的,因此模型内部的数组很可能与修改后的控制器不同。这是基本的 OOP。你现在到底是什么问题?请注意,您只需要执行$this->request->data = $this->Model->data
即可将最新数据再次返回到控制器中(但通常没有必要)。
澄清一点,$this-request-data 没有改变,保存失败,尽管我没有看到验证失败或其他错误。
你检查$this->Model->validationErrors
了吗?它包含错误。
我确实检查了验证错误。
我确实检查了验证错误。当前保存返回消息“无法保存用户。请重试。”如果无论如何我让我的验证规则返回 true,并在保存之前注释掉我的行为,我仍然会失败。目前尚不清楚保存失败的原因。
【参考方案1】:
只是为了向您解释数据数组,当您提交表单时,其中的数据存储在控制器上的$this->request->data
中。然后,您从模型内部修改$this->User->data
,这是模型本身的不同数组。它不会影响$this->request->data
,因为它是一个完全不同的数组,属于控制器,模型不知道它。
然后,您将使用请求数据保存用户模型,该数据自提交表单时起保持不变。这是合乎逻辑且正常的行为,因为您实际上并未使用已修改的 $this->User->data
数组。
您的保存可能总是失败,因为模型尝试保存的数据不是更新后的数据,它只是来自$this->request->data
的基本数据。
试试这个:
$this->User->set($this->request->data);
$this->User->save();
另外,如果您在模型中使用beforeSave
,请确保该方法返回true
,否则它永远不会真正继续保存。
【讨论】:
以上是关于CakePHP 数据在验证期间发生更改,并且 beforeSave 未随更改一起保存的主要内容,如果未能解决你的问题,请参考以下文章
在 cakephp 中编辑用户配置文件后如何更改身份验证用户名