4

Zend uygulaması üzerinde çalışıyorum, ancak Zend ile çok fazla deneyimim yok, bu yüzden sadece RubyOnRails deneyimime güveniyorum.Zend Model doğrulama

Çift makalelerden, doğrulamanın çoğunun Formlar düzeyinde - Zend_Form ile - uygulandığını buldum. Ama benim için biraz garip görünüyor - nasıl model düzeyinde bir doğrulama var - form verileri dayalı bir model oluşturmak ve $model->isValid(); gibi smth çalıştırmak, form istekleri olmadan bazı modeller oluştururken anlamlıdır.

Benim şu anki modelin akışı:

ProductMapper extends Zend_Db_Table 
Product extends Zend_Db_Table_Row 

Ve ben sadece isValid yönteminin içine RegExp ile doğrulama yapabileceği farkındayım ama İsterdim ben

$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 { 
    ... 
} 

gibi bir şey yapıyorum verilen addValidator, addFilter gibi Zend_Form'dan zaten uygulanan yöntemleri ve tüm bu kullanışlı şeyleri kullanmak.

Ayrıca, Zend'deki modelleri yönetmenin bu doğru yolu nedir?

Herhangi bir yardım veya öneri çok takdir edilecektir! Sen Zend_Form aynı filtreleri ve/veya doğrulayıcılarını kullanabilirsiniz ancak yapabileceğiniz bu

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

veya

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

gibi böylece satır sınıfında kendi yöntemi isValid() oluşturabilir

cevap

2

değerleme ve filtreleme değerlerini kendi mantığını gerçekleştirin

+0

Tahmin edilmesi kolay görünüyor. Zend lib klasörünü kontrol etmeliydim :) Teşekkürler! – fantactuka

1

Zend modellerinde yalnızca Db nesnelerinin gösterimleri değil, çoğu nesnenin aslında veritabanıyla ilgisi yoktur ve Model iş mantığı için. Bu bağlamda küresel bir doğrulama yöntemine sahip olmak anlamlı değildir. Zend_Db_Table ve Row, db nesnesi ile oynarken, birincil Anahtarın hangisi olduğunu kontrol etmek gibi bazı kontroller yapar, ancak Active Record gibi bir şey istiyorsanız, bu sınıfları kendiniz genişletmeniz gerekir.

+1

Katılıyorum, ancak 'Zend_Db_Table_Row' db satırının temsili olduğundan, geçerliliğe sahip olduğu anlamına gelir. Temel Modeller buna ihtiyaç duymaz. – fantactuka

0

Db katmanının (ZF nesneleri Tablo, Satır) doğrulama için doğru yer olduğu konusunda hemfikir değilim. IHMO doğrulama, uygulama mantığı veya iş kısıtlamasıdır.

Doğrulama işlemi beton Modele yerleştirilmelidir. DB katmanı temiz olmalı ve sadece veritabanı işlemini yapmaktan sorumludur (ekleme, güncelleme, silme, seçme).

Modeliniz, hangi özniteliklerin gerekli olduğunu (veya öznitelik türünü) bilmelidir, bu nedenle doğrulama için doğru bir yer vardır. As

Elzo said - Bazı mankenler DB nesneleri temsil edilmez - böylece veritabanına dayalı modeller için doğrulamak bir yöntemi vardır arayüzü IPersistenceable yapmalıdır. Bu modeller, kendi doğrulama algoritmasını uygulamalıdır.

Bu yaklaşım yararlıdır - her modelin çeşitli doğrulama yöntemleri olabilir. Sonraki yaklaşım - birincil anahtar + geçerlilik yönteminin temel doğrulamasıyla soyut sınıf yapabilir ve her bir kalıcı model bu sınıfı genişletir.