修改模型 CakePHP 中的 $this->request->data?

Modify $this->request->data in model CakePHP?

如何在 CakePHP 中修改模型中的 $this->request->data。我用模型用户中的代码尝试了它:

public function beforeValidate($options = array()) {
    unset($this->request->data['User']['birthday']);
}

但是 return 错误:

Notice (8): Indirect modification of overloaded property User::$request has no effect

Warning (2): Attempt to modify property of non-object

如果我使用(模型用户):

public function beforeValidate($options = array()) {
    unset($this->data[$this->alias]['birthday']);
}

没问题,但是在验证之后,当我在控制器中尝试 print_r($this->request->data) 时,我看到生日字段仍然存在于其中。

任何人都可以给我一个解决方案,$this->data 和 $this->request->data 是不同的,谢谢!!

编辑:我的 CakePHP 版本是 2.6.7 - 最新版本。

无法从模型中访问

$this->request->data。此数据只能从控制器访问。当您尝试从控制器(例如 $this->User->save($this->request->data)))将数据保存到模型时,您正在设置 User 模型的 data 属性。换句话说,这正在发生:-

$this->User->data = $this->request->data;

因此,在模型的回调方法中,您可以使用 $this->data 访问正在保存的数据,并按照您在 beforeValidate():-

中找到的方式对其进行操作
public function beforeValidate($options = array()) {
    // Unset 'birthday' from data being saved
    unset($this->data[$this->alias]['birthday']);
    return parent::beforeValidate($options);
}

不要忘记使用此回调调用父方法并确保它 return 是布尔值。如果没有 return true 您的数据将不会被保存!

如果您在模型中操作 $this->data,它不会影响 $this->request->data,但您始终可以从控制器中访问模型的 data 属性以查看更改。例如,在保存更改后的控制器中:-

// Output the User data
debug($this->User->data);

如果你真的想改变 $this->request->data 那么你需要从控制器(大概是在保存之前)而不是模型中这样做:-

unset($this->request->data[$this->alias]['birthday']);

作为旁注,请注意在模型回调中取消设置数据,因为每次您尝试保存数据时它都会这样做(除非您禁用回调)。因此取消设置 birthday 将导致它永远不会保存到您的数据库中。