在我的一些屬性的Yii模型中,當真實屬性爲null或爲空時,我想返回一些默認值。重寫ActiveRecord在Yii中獲取屬性
例如說我有一個display_name
屬性。沒有設置時,我想返回first_name
。
到目前爲止,我一直在使用的解決方法是創建一個名稱不同的新方法,然後調用此方法。不過,如果我可以通過簡單地以正常方式調用$model->display_name
來實現這一點,那就太好了。
在我的一些屬性的Yii模型中,當真實屬性爲null或爲空時,我想返回一些默認值。重寫ActiveRecord在Yii中獲取屬性
例如說我有一個display_name
屬性。沒有設置時,我想返回first_name
。
到目前爲止,我一直在使用的解決方法是創建一個名稱不同的新方法,然後調用此方法。不過,如果我可以通過簡單地以正常方式調用$model->display_name
來實現這一點,那就太好了。
我可能找到了我自己的答案。我優先於__get()
來檢查這是否是我正在尋找的財產。我不確定這被認爲是「最佳做法」。
public function __get($name) {
$current = parent::__get($name);
switch($name){
case 'display_name':
if(empty($current)){
return $this->first_name;
}
else{
return $current;
}
break;
default:
return $current;
}
}
類延伸CComponent
,包括CModel
,CActiveRecord
第一將尋找一個getter方法。
在你的榜樣,你必須定義一個getter函數:
public function getdisplay_name() {
if (! empty($this->display_name)) {
return $this->display_name;
} else {
return $this->first_name;
}
}
請檢查CActiveRecord :: __ get()implmenentation。當display_name是數據庫屬性時,您的示例不適用於CActiveRecord的實例。 – sieppl
這將在後面的大開關case語句的結果,我已經正如我所提到的描述更容易和更清潔的解決方案,我的回答 – Blacksonic
我的問題,我已經有了類似的解決方案。但我試圖不必爲所有人記憶備用功能,再加上一些模塊或擴展可能不會被我編碼。 –
我認爲這將在版本2中改變。如果我們定義一個自定義的getX()方法,那麼即使模型已經定義了x屬性,也應該調用**我們的**覆蓋方法。 –