MVC modeli verisinin özel kontroller koymak

3 Cevap php

I'm writing my first application with Zendframework. My question is about the Model–View–Controller (MVC) architectural pattern.

I currently have a model with refer to a database table. Here's the classes that I currently have :

Model_Person 
Model_PersonMapper 
Model_DbTable_Person

Now, I see a lot of examples on the net, but all of them are simple cases of insert/update/delete. In my situation, I have to check if a person exists, and if it doesn't, I have to insert it and retrieve the ID (I know save return the Id, but it's not exactly what I have to do, this is and example).

Bu basit çıkmak, ama ben burada tüm diğer özel durumlar için veritabanı mantığı koymak bilmek istiyorum ediyor. Bazıları durumlarda diğer tablolar arasında çek ya da ... neyse içerebilir!

Ben yapmak istiyorum geçerli doğrulama / işlemi ile çok özel olacak bir şey ile benim Model_XXXXMapper tüm özel fonksiyonlar eklemek gerekir? gibi bir işlev getIdOfThePersonByNameOrInsertIfNotExists () (tabii numune ismi!)

Biraz daha az özellikleri benim modeli için, onaylanmış, olacağını erişmek ya da denetleyicisi ikamet gerekir?

Diğer kelime, ben burada tüm veri özelliklerini işlevlerini koymak veya kontrol edebilirim?

3 Cevap

Ben gerçek iş değil denetleyicisi, kendi modeli nesneleri meydana gerektiğini düşünüyorum. Herhangi seçer / person masa gibi şeyler, DbTable_Person nesne olurdu ile bu başlangıç ​​oluşturur:

// DbTable_Person
// returns sets of or single Person objects
public function createByName( $name ) // perhaps throws exception if name already exists
public function findById( $id )
public function findByName( $name )
public function findHavingAccount( $account_id ) // references another table

// controller
// with your example, like what Galen said,
// I would let the controller handle this logic
$person = $person_table->findByName($name);
if ( !$person ) {
  $person = $person_table->createByName($name);
}
if ( !$person ) { throw new Zend_Exception('huh?'); }
$id = $person->id; // you wanted the ID

Ben kesinlikle işlevleri oluşturmak / arayış içine fonksiyonu bölünmüş olacaktır.

Burada temel bir uygulama var ...

$personTG = new Model_PersonTableGateway;
if ( !$person = $personTG->findByName( $name ) ) {

    $person = new Model_Person;
    $person->name = $name;
    // other variables
    $newPersonId = $personTG->create( $person ); // creates a new person

}

Ben kullanmak table gateway. Sen TG için sınıf yerine kullanabilirsiniz.

Bunu size kalmış ... oluşturmak () işlevi geri dönüşünü sadece yeni oluşturulan kişinin kimliği, veya tüm kişi olabilir.

Sen Zend_Validate_Db_NoRecordExists ve onun kız kardeşi ilginizi çekebilir. Eğer Zend_Form kullanıyorsanız size form elemanı için bu doğrulayıcı ekleyebilirsiniz. Birçok millet bu etki modeli ulaşmadan verileri doğrulamak ve filtrelemek için Zend_Form kullanın.

Eğer Zend_Form kullanarak değilseniz, sadece servis katmanında bu doğrulama sınıfını kullanabilirsiniz. Basit bir hizmet sınıfı gibi bir şey olabilir

 `
class Service_Person_Validate 
{ 
  public function creatable($data) 
  { // return true|false 
  } 
}