Изменить данные $this-›request-›в модели CakePHP?

Как я могу изменить $this->request->data из модели в CakePHP. Я попробовал это с кодом в модели 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 - самая новая версия.


person user3209287    schedule 20.06.2015    source источник
comment
Вы всегда должны указывать точную версию cakephp, которую вы используете.   -  person mark    schedule 20.06.2015
comment
Ты хоть погуглил ошибку? Есть несколько примеров. Например: stackoverflow.com/questions/13421661/   -  person Mike    schedule 20.06.2015
comment
Не забывайте пинговать людей с @ перед их именем, когда вы отвечаете им (например, @mark), иначе они не будут уведомлены о вашем ответе.   -  person Mike    schedule 20.06.2015


Ответы (1)


$this->request->data нельзя получить доступ из модели. Эти данные доступны только из контроллера. Когда вы пытаетесь сохранить данные в модель из контроллера (например, $this->User->save($this->request->data))), вы устанавливаете атрибут data модели User. Другими словами, это происходит:

$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 приведет к тому, что он никогда не будет сохранен в вашей базе данных.

person drmonkeyninja    schedule 20.06.2015