Validation 验证期间和保存之前的CakePHP数据更改不会随更改一起保存

Validation 验证期间和保存之前的CakePHP数据更改不会随更改一起保存,validation,cakephp,save,cakephp-2.0,before-save,Validation,Cakephp,Save,Cakephp 2.0,Before Save,我正在保存从表单发送的数据 在控制器中,我正在执行以下操作: $this->User->create(); $this->User->save($this->request->data) $this->request->数据如下所示: 'User' => array( 'password' => '*****', 'username' => 'ddddd', 'role' => '256/aa01bdf80d4

我正在保存从表单发送的数据

在控制器中,我正在执行以下操作:

$this->User->create();
$this->User->save($this->request->data)
$this->request->数据如下所示:

'User' => array(
    'password' => '*****',
    'username' => 'ddddd',
    'role' => '256/aa01bdf80d42beb48dd3225acddf447fdd7a39f3',
    'parent_id' => '0/b6ba9bd57f6c70cf738891d4c6fac22abed4161d'
)
$Model->data[$Model->alias][$ancestors] = $ancestorList;
'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,'
)
在“角色”和“父id”上有有效的验证规则,以确保角色/父id是用户可以访问的

如果数据有效,验证将更改字段值

我还有一个树行为,在行为中的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()使用以下语句更改数据数组:

'User' => array(
    'password' => '*****',
    'username' => 'ddddd',
    'role' => '256/aa01bdf80d42beb48dd3225acddf447fdd7a39f3',
    'parent_id' => '0/b6ba9bd57f6c70cf738891d4c6fac22abed4161d'
)
$Model->data[$Model->alias][$ancestors] = $ancestorList;
'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,'
)
当验证和beforeFilter()处理完成后,我在
$this->User->data
处有一个漂亮且正确的数据数组,如下所示:

'User' => array(
    'password' => '*****',
    'username' => 'ddddd',
    'role' => '256/aa01bdf80d42beb48dd3225acddf447fdd7a39f3',
    'parent_id' => '0/b6ba9bd57f6c70cf738891d4c6fac22abed4161d'
)
$Model->data[$Model->alias][$ancestors] = $ancestorList;
'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
保持不变。这就是我们正在拯救的东西

显然,我不理解这些获取数据的各种方式之间的关系。我尝试了多种方法在三种上下文中处理数据:

  • 控制器
  • 模型
  • 行为
我尝试了
$this->User->create($this->request->data)
在Controller save()语句之前

在控制器中,我看到的是可用的数据阵列:

  • 在保存之前
  • $this->request->data=$this->data=表单中的正确数据
  • $this->User->data=一些默认的未填充数组

  • 在使用$this->User->create($this->request->data)进行保存之前

  • 这三个数组都包含原始表单数据

  • 在任何一种情况下,在保存之后

  • $this->request->data=$this->data=与前面一样
  • $this->User->data=正确处理的数据
有人能帮我解决吗


Don Drake

仅向您解释数据数组,当您提交表单时,表单中的数据存储在控制器上的
$this->request->data
中。然后从模型内部修改
$this->User->data
,模型本身就是一个不同的数组。它不会影响
$this->request->data
,因为它是属于控制器的一个完全不同的数组,并且模型不知道它

然后,您将使用请求数据保存用户模型,该数据从提交表单时起保持不变。这是合乎逻辑的正常行为,因为您实际上没有使用已修改的
$This->User->data
数组

您的保存可能总是失败,因为模型试图保存的数据不是更新的数据,而是来自
$this->request->data
的基本数据

试试这个:

$this->User->set($this->request->data);
$this->User->save();

此外,如果您在模型中使用的是在保存之前使用的
,请确保该方法返回
true
,否则它将永远不会继续保存。

数据不会通过引用传递(到模型),因此修改后模型中的数组很可能与控制器中的数组不同。这是基本的面向对象编程。你现在到底有什么问题?请注意,您只需执行
$this->request->data=$this->Model->data
,即可将最新数据重新放入控制器中(但通常不需要)。为了澄清一点,$此请求数据未更改,保存失败,但我看不到任何验证失败或其他错误。是否检查了
$this->Model->validationErrors
?它包含错误。我检查了验证错误。我检查了验证错误。当前保存正在返回消息“用户无法保存。请重试”。如果我使我的验证规则无论如何返回true,并在保存前注释掉我的行为,我仍然会失败。目前还不清楚为什么拯救失败了。