4

我正在開發Zend應用程序,但對Zend沒有太多經驗,所以僅僅依賴於我的RubyOnRails體驗。Zend模型驗證

從幾篇文章中我發現大多數驗證是在Forms級別上實現的 - 使用Zend_Form。但它對我來說看起來有點奇怪 - 如何在模型級別進行驗證 - 基於表單數據創建模型並運行如第$model->isValid();這樣的模式很有意義,因爲我創建了一些沒有表單發佈請求的模型。

我目前的模型流程:

ProductMapper extends Zend_Db_Table 
Product extends Zend_Db_Table_Row 

而且給我做這樣的事情

$mapper = new ProductMapper(); 
$product => $mapper->find(...); 

// Do some staff with this model 
// And want to check if it's valid before saving 

if ($product.isValid()) { 
    $product.save(); // Zend_Db_Table_Row method 
} else { 
    ... 
} 

我知道我可以簡單地做驗證用正則表達式裏面isValid方法,但我想使用Zend_Form已實施的方法,如addValidator,addFilter和所有有用的東西。

也是這種在Zend中管理模型的正確方法嗎?

任何幫助或建議將非常感激!

回答

2

您可以使用相同的過濾器和/或作爲校驗Zend_Form的,但像這樣

$validator = new Zend_Validate_Allnum(); 
if ($validator->isValid($data) 
do some code 

$filter = new Zend_Filter_StringTrim(); 
$filteredVal = $filter->filter($val); 

這樣你就可以在你的行類來創建你自己的方法IsValid(),您可以執行您自己的驗證和過濾值邏輯

+0

看起來很容易猜到。我應該檢查Zend lib文件夾:)謝謝! – fantactuka 2010-11-19 12:23:49

1

Zend中的模型不僅是Db對象的表示,大多數對象實際上與數據庫無關,並且是Model用於商業邏輯。在這種情況下,採用全球驗證方法是沒有意義的。 Zend_Db_Table和Row會在使用db對象時執行一些檢查,比如檢查哪個是主鍵,但是如果你想要類似Active Record的東西,你必須自己擴展這些類。

+1

同意,但由於'Zend_Db_Table_Row'是db行的表示,所以它有驗證是有意義的。基本模型不需要它。 – fantactuka 2010-11-19 12:23:20

0

我不同意數據庫層(ZF對象表,行)是驗證的正確位置。 IHMO驗證是應用程序邏輯或業務約束。

驗證過程必須放置在具體的模型中。數據庫層必須是乾淨的,只負責簡單地進行數據庫操作(插入,更新,刪除,選擇)。

您的模型必須知道哪些屬性是必需的(或屬性的數據類型),因此有適合驗證的地方。

由於Elzo said - 某些型號並不代表DB的對象 - 因此你應該做接口IPersistenceable其中有一個方法驗證爲數據庫驅動的車型。這些模型必須實現自己的驗證算法。

這種方法是有用的 - 每個模型可以有各種驗證方式。下一種方法 - 您可以使用主鍵+驗證方法的基本驗證來創建抽象類,每個可持續模型擴展此類。