Zend Framework modelleri

12 Cevap php

Eğer Zend Framework modelleri hayata geçirdik bazı yollar nelerdir?

Ben temel class User extends Zend_Db_Table_Abstract gördük ve sonra denetleyicileri bu çağrıları koyarak adres:

$foo = new User;

$foo->fetchAll()

ama ne daha sofistike kullanımları hakkında? Belgelerin Hızlı Başlangıç ​​bölümünde böyle bir örnek sunuyor ama ben Zend Framework modelleri için bir "iyi kullanım" örnek almıyorum gibi ben hala hissediyorum. Herhangi bir ilginç uygulamaları orada?


EDIT: I (CMS yorumuna yanıt olarak) ... Ben daha karmaşık seçer yapıyor hakkında bilmeniz açıklamak gerekir. Ben Model kavramına genel yaklaşımlar ve diğerleri (temelde, malzeme elle dışarı bırakır ve temel nasıl yapılır şeyler geçiştirmeye) bunları hayata nasıl somut örnekler de ilgilendi

12 Cevap

Ben şahsen alt sınıf hem Zend_Db_Table_Abstract ve Zend_Db_Table_Row_Abstract. Benim kod sizinki arasındaki temel fark, açıkça bir "masa" olarak Zend_Db_Table_Abstract alt sınıfı tedavi ve Zend_Db_Table_Row_Abstract "satırı" gibi olmasıdır. Çok nadiren nesneleri, SQL, ya da seçmek için doğrudan çağrı görüyorsunuz benim denetleyicileri ZF veritabanı yöntemlerle inşa. Arkamda Zend_Db_Table_Abstract şöyle çağrılarına belirli kayıtları isteme mantığı gizlemek için deneyin:

class Users extends Zend_Db_Table_Abstract {

    protected $_name = 'users';

    protected $_rowClass = 'User'; // <== THIS IS REALLY HELPFUL

    public function getById($id) {
        // RETURNS ONE INSTANCE OF 'User'
    }

    public function getActiveUsers() {
        // RETURNS MULTIPLE 'User' OBJECTS            
    }

}

class User extends Zend_Db_Table_Row_Abstract {

    public function setPassword() {
        // SET THE PASSWORD FOR A SINGLE ROW
    }

}

/* CONTROLLER */
public function setPasswordAction() {

    /* GET YOUR PARAMS */

    $users = new Users();

    $user = $users->getById($id);

    $user->setPassword($password);

    $user->save();
}

Bu yaklaşım birçok yolu vardır. Bu tek olduğunu düşünüyorum, ama ben ZF tasarım niyet takip etmeye çalışmayın. Bu yaklaşım biraz sınıfı ağır olsun, ama ben bu girişi işleme ve görünümü ile koordine odaklanmış denetleyicileri tutar hissediyorum (. İşte benim thoughts and links on the subject daha fazladır) uygulama belirli işi yapmak için modelini bırakarak.

Ben Zend için çalıştı ve Zend_Db_Table bileşen üzerinde çalışma biraz yaptım.

Zend Framework Alan Modeli desenine göre bir "Model" kavramına rehberlik bir sürü vermez. Model uygulamanıza iş mantığı spesifik bir kısmını saklar çünkü Modeli için hiçbir temel sınıf var. Ben daha ayrıntılı olarak bu konuda bir blog yazdı.

Bir veritabanına sebat Bir Modelin dahili bir uygulama olmalıdır. Model tipik uses, bir veya daha fazla tablo. Bu tablo bir uzantısı olarak bir modeli düşünün bir ortak fakat yanlış nesneye yönelik tasarım. Diğer bir deyişle, biz demeliyim Model HAS-A Tablo - değil Modeli IS-A Tablo.

Bu IS-A'nın bir örneği aşağıda verilmektedir:

class MyModel extends Zend_Db_Table_Abstract
{
} 

Bu HAS-A'nın bir örneği aşağıda verilmektedir:

class MyModel // extends nothing
{
    protected $some_table;
}

Gerçek bir etki modelde, olur MyModel yöntemlerinde use $ some_table.

Ayrıca Domain Model tasarım deseni Martin Fowler üstlenmek, ve ne yazık ki pek çok geliştirici bir yaklaşım OO programlama Anemic Domain Model antipattern, onun açıklamasını okuyabilirsiniz.

Hiç model olarak Zend_Db_Table kullanmayın. Bu sadece sıkıntı içine alır. Ya sizin veritabanına konuşmak için Zend_Db_Table kullanmak veya biraz "Model" sınıf ve Zend_Db_Table birleştirmek sağlayan bir kesmek için benim blog yazısı here okuyabilir, kendi modeli sınıfları yazmak.

Değil önemli şey sizin denetleyicileri doğrudan Zend_Db_Table kullandığınızda birden çok yerde aynı şeyleri yapıyor sonuna kadar olmasıdır. Eğer bu mantık bazı bir değişiklik yapmak varsa, birden fazla yerde bir değişiklik yapmak zorunda. Iyi değil. Ben ZF kullanmayı öğrenmek zorunda şirket biriydi ve şimdi bir karmaşa çünkü benim ilk profesyonel proje böyle yapıldı.

Ayrıca ben sofistike fetches benim sınıflara yardımcı işlevlerini yazmak eğilimindedir. Somthing $ tablo-> doNameFetchAll () veya $ tablo-> doOrderFetchAll () gibi.

Ben ZF için modeller üzerinde biraz araştırma yapıyor ve kontrol dışarı değer Matthew Weier O'Phinney tarafından makale ilginç bir dizi geldi oldum:

Bu "üretim kodu" değil ve bir sürü hayal gücüne bırakılır, ama iyi bir okuma ve bana biraz yardımcı oldu.

Bir model vardır nothing to do with the database. Ne bir RSS beslemesi veya bir soap hizmetinden veri alma veya FS dosyaları okuma ediyorsam?

Ben modelleri şeyler her bu tür koydu. Bu durumda, benim modeli class olabilir not extend anything. Ben diğer modellerin yöntemlerini kullanan bir model yazmak üzereyim.

Modeller bölümü için ZF atlamak, çok daha iyi çözümler vardır. ZF "MVC" in "M" oldukça fazla yoktur. Onlar gerçekten tüm modellerini söz yok kendi dokümanlar Okuma - iyi bir şey olduğu, bu adaptör çok fazla kod yazmadan istediğiniz her şey sadece kullanabileceğiniz anlamına gelir.

Yerine modeller için Doctrine bir göz atın. Bu hızlı PHP için de-facto ORM haline gelmektedir.

Sen, daha karmaşık sorguları yapmak Zend_Db_Table kılavuz sayfasına Advanced usage bölümünü kontrol edebilirsiniz.

$select = $table->select();
$select->from($table,
              array('COUNT(reported_by) as `count`', 'reported_by'))
       ->where('bug_status = ?', 'NEW')
       ->group('reported_by');

Eğer Zend_Db_Table_Abstract sınıfını genişletmek ve ona bazı kullanışlı yöntemler ekleyebilirsiniz. Örneğin bunu verilerini kullanıcı sınıfına changepassword () yöntemini ekleyin ve işleyebilirsiniz. veya varsayılan __ toString (sınıfın) yöntemi değiştirebilirsiniz, böylece, en iyi biçimlendirilmiş dize döndürür kullanıcı (isim, adres, telefon numarası) tüm iletişim bilgilerini diyelim özelleştirilmiş __ toString () yöntemini olacak . Yapıcınızda içinde size nesnenin özelliklerini içine veri doldurmak olabilir. sonra gibi bunları kullanmak:

public function __toString() {
   $data = $this->_name . ', ' . $this->_adderss . ', call: ' . $this->_phone;
   return $data;
}

your model extends the Zend_Db_Table_Abstract just to ease the process of accessing its data, but the functionality you could have on that data is all up on your creativity and need. I recommend you the book "php|architect's guide to programming with zend framework" by Cal Evans. the book is very informative and easy to read. chapters 4 and 6 are going to be useful for this matter.

Bir veritabanı varlık modeli bileşeni tek tür değildir. Gibi, gerçekten (çoğul) modellerin konuşmak mantıklı değil - Sizin uygulama bileşenlerinin çok sayıda içeren one modeli vardır. Bu bileşenlerden bazıları, masa geçitleri olmak (Ve böylece Zend_Db uzanan) olabilir, diğerleri olmaz ise.

Ben bir nesne modeli oluşturmak için nasıl açıklayan mükemmel bir iş yapar Domain Driven Design Eric Evans kitap, ele almanızı öneririz.

I use Propel 1.3 instead of Zend_Db_Table. It's tricky to setup, but awesome. It can examine your database and auto-generate all your models. It actually generates 2 levels and 2 types of model.

'Kullanıcı' tablosu için örnekler:

Seviye 1: Temel Model & BasePeer: Bu sizin ORM yeniden her zaman üzerine olsun. yani BaseUser.php & BaseUserPeer.php

Seviye 2: StubModel & StubPeer: Bu yazılır alamadım. Onlar özelleştirmek bizleriz. yani User.php & UserPeer.php

Type 1: Model - for basic CRUD operations, not queries i.e. User.php Type 2: Peer -- for queries. These are static objects. i.e. UserPeer.php

Yani bir kullanıcı oluşturmak için:

$derek = new User();
$derek->setFirstName('Derek');
$derek->save();

Tüm Dereks bulmak için:

$c = new Criteria();
$c->add(UserPeer::FIRST_NAME, 'Derek');
$dereks = UserPeer::doSelect($c);

Ben bu anahtar kelimeler için biraz etrafında Yağ Modelleri ve Skinny Kontrolörleri http://www.survivethedeepend.com/zendframeworkbook/en/1.0/the.model ve Google hakkında bu makaleyi okumanızı öneririz.

http://zfsite.andreinikolov.com/2008/08/zend_db_table-time-overhead-about-25-percents/

Bir yakalama 22 bit, Zend_Table prensipte güzel, ama (önbelleğe alma olmadan) bazı performans giderleri üretir ...