3

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

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

但它返回错误:

注意(8):间接修改重载属性User::$request无效

警告(2):试图修改非对象的属性

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

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 - 最新版本。

4

1 回答 1

4

$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);
}

使用此回调调用父方法并确保它返回布尔值时不要忘记。如果它不返回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设置将导致它永远不会保存到您的数据库中。

于 2015-06-20T08:10:14.647 回答