2015-06-20 21 views
3

如何在CakePHP中從模型中修改$ this-> request-> data。我的代碼試圖在模型用戶:

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

但它會返回錯誤:

通知(8):過載性能 用戶:: $請求間接修改沒有影響

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

+0

您應該始終提及您正在使用的確切cakephp版本。 – mark

+0

你甚至谷歌錯誤?有幾個例子。像這樣:http:// stackoverflow。com/questions/13421661/getting-indirect-modification-of-overloaded-property-has-no-effect-notice – Mike

+1

當你回覆他們時,不要忘記用@在他們的名字之前用@標記他人(像這樣:@mark ),否則他們將不會收到您的回覆通知。 – Mike

回答

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會導致它永遠不會保存到您的數據庫。