2010-12-09 79 views
1

我使用Zend的一些模型抽象類。Zend Framework的模型抽象和空值

  • Default_Model_Abstract:包含__set和__get以及每個值的setter和getter,並作爲虛擬對象工作。
  • Default_Model_AbstractMapper:包含save(),find(),fetchall()等方法。

幾個月前我在Zend Quick Start文檔中發現了這個解決方案。但在過去幾個月裏,我在處理空值時遇到了一些問題。

我有一個Zend_Form_Element_Select元素,它從數據庫中獲取它的值。它的值是來自外鍵的ID。所以只接受有效的外鍵id或null。但是Zend_Form_Element_Select元素是可選的,所以可能會得到一個空字符串( - > addMultiOption(null,'Choose your option'))。但是這會給我一個錯誤,因爲一個空字符串不是一個有效的外鍵id既不是null也是允許的。

我的第一個嘗試是檢查我的控制器處理表單,如果select元素值是一個emptry字符串並將其更改爲null。這很醜陋,問題在於,我的setter將null更改爲0,因爲我使用(int)$ value對其進行了驗證。

public function setId($value) 
{ 
    $this->_id = (int) $value; 
    return $this; 
} 

所以另一種方法是,我查一下我的二傳手,如果該值爲空,然後我不(INT)驗證它。那看起來就像那樣。

public function setId($value) 
{ 
    if($value !== null) 
     $this->_id = (int) $value; 
    return $this; 
} 

這會工作FR這種情況下,但我沒有任何意義,因爲有時我想這樣重置現有的值設置爲null。所以我不能在setter中忽略null值。所以另一種方法是:

public function setId($value) 
{ 
    if($value !== null) 
     $this->_id = (int) $value; 
    else 
     $this->_id = null; 
    return $this; 
} 

但現在它真的很難看。我很好奇看到你們如何解決這個問題。因爲我認爲必須有一個簡單的解決方案,而不需要在setter中移除(int)。因爲據我所見,這似乎是使用setter的常用方法。

最好的問候, 尼科

+0

這不是你的__set或__get問題的答案,但你可以在控制器中驗證if(trim($ yourselect)== '')$ yourselect = null; ? – Ashley 2010-12-09 09:43:16

回答

1

我想不出任何其他方式做到這一點邏輯,明智的。如果你覺得這太冗長了,你可以把if/else變成一個三元運算符表達式。這將使它成爲一線。

$this->_id = ($value !== NULL) ? (int) $value : NULL; 
return $this; 

另一種選擇是你的if/else進入自定義Zend_FilterNullOrInt。這可以在需要此檢查的任何地方重新使用,例如在控制器級別驗證請求輸入或在Zend_Form或在您的二傳手等

+1

這是一個很好的解決方案,謝謝戈登。我將使用一個驗證器,這樣我就可以將所有的「智能」留給表單,並且不必再關注控制器或模型。 – Nico 2010-12-09 22:00:11