Zend_Registry: gerçek yaşam örnekleri

3 Cevap php

Bulmak Zend_Registry yararlı mı?

Hangi görevleri için kullanılmalıdır? Hangi değil?

Global state for variables is not a good practice. Main objects may have global state injected via $front->setParam('paramName', $object), so what's the purpose of Zend_Registry?.

3 Cevap

Alıntı PoEAA on Registry Pattern:

Eğer bir nesneyi bulmak için istediğiniz zaman genellikle bunun için bir dernek sahip başka bir nesne ile başlar, ve ona gitmek için dernek kullanmak. Eğer bir müşteri için bütün siparişleri bulmak istiyorsanız Böylece, müşteri nesne ile başlar ve siparişleri almak için onun bir yöntemi kullanabilirsiniz. Ancak, bazı durumlarda size başlamak için uygun bir nesne olmaz. Sen müşterinin kimlik numarasını biliyorum ama bir başvuru olmayabilir. Bir bulucu - - Bu durumda arama yöntemi çeşit gerekir ama soru kalır: Nasıl bulucu alabilirim?

Kolay erişilebilir bir uygulama kapsamı oluşturur çünkü kayıt defteri kullanmak neden ana nedeni (when I use it) olduğunu. Kayıt defteri ile, ben çöp tüm küresel kapsamı üzerinde nesneleri gerekmez; Sadece Kayıt kendisi küreseldir. Ben modeli de dahil olmak üzere, her yerde Kayıt içine atılan her neyse arama için uygundur:

  • Zend_Cache, Zend_Translate, önemli uygulamaları yolları, vb

Ancak, sadece Singletons olduğu gibi, Kayıt Defteri genellikle hoş karşılanmaz. İşte bir article by Brandon Savage with some thought about why not to use the Registry olduğunu. Sicil karşı başlıca argümanlar

  • Bu birim test zorlaştırır
  • deneyimsiz programcılar çok fazla içine atmak olabilir ve uygun tasarım umurumda değil

Eğer bunun bir örneği var bir kez de Kayıt enjekte edebilir dikkat edilmelidir rağmen Sicil karşı oy olanlar genellikle, Dependency Injection kullanımını savunuyoruz. Sen yok Inversion of Control ardından kullanarak nesne Kayıt Defteri'ndeki ihtiyacı çeker, çünkü olsa. Hizmet Locator Registry kullanma olsa, geçerli bir yaklaşımdır.

Bu bak article by Martin Fowler about ServiceLocator vs. Dependency Injection.

Sorunuzun açıklamalarda işaret gibi, Zend_Registry sıkı bir Singleton değildir. Eğer Zend_Registry::getInstance() ile olsun küresel örneğini kullanarak ek olarak gerektiğinde birden çok örneğini örneğini. Yani nesneleri kendi kayıt olabilir. Registry, bu şekilde kullanarak Ama, temelde sadece övmek DiziNesnesi bulunuyor.

Son bir not: sorunun varsa sadece tüm Design Patterns olduğu gibi, bunu kullanın.

Eğer $front->setParam kullanırken, size Front Controller bir parametre tanımlıyoruz.

Ancak bu parametre, model olarak, uygulamanın (or should not be used from), diğer tabakalar içinde mevcut değildir.

Modelin içine dahil - Zend_Registry, diğer herhangi bir global değişken gibi, her yerde uygulamanızda edinilebilir.

Ama bunun yerine küresel değişken bir demet Registry kullanarak her yerde, birçok küresel değişken olmaz sağlar:. Registry kullanarak (which is not that good, one should say), sahip olmak daha iyi olduğunu tek bir yerde bazı küresel devlet ima bile


A couple of real life examples could be :

  • Bootsreap kurulan, ancak Modeller kullanılan veritabanı bağlantısı, Mağaza
  • Küresel (or any mecanism) Uygulamanın tüm katmanlarında çeviriler / yerelleştirme yapmak için kullanılacak bir adaptör saklama - Zend Framework kendisi yapar.


In the end, do I find Zend_Registry useful ?

Bazı küresel devlet sahip gelince Evet, evet, bu yararlıdır.

But if it's usage can be avoided, it might be better : conceptually speaking, not having your classes depend on any global state is better : easier to re-use, easier to test, ...
About that, you might want to take a look at what Dependency Injection is.

I Pascal MARTIN katılıyorum. Ben sadece Enjeksiyon bağımlılık kendimi accustoming başladı. Ama denetleyicileri nesneleri enjekte etmek için bir yol bulundu, bu yüzden ne Geçenlerde yaptım denetleyicisi bir hizmete erişmek için kullanım de kayıt oldu değil. Geçerli projede ben şu yapıyorum:

bootstrap:

// simple DI without an IoC container, and what have you
$dbAdapter    = Zend_Db::factory( /* bla bla */ );
$mediaService = new Service_Media( new Repository_Media_Db( $dbAdapter ) );
$registry     = Zend_Registry::getInstance();
$registry->mediaService = $mediaService;

...then in a controller:

public function init()
{
    $this->_mediaService = Zend_Registry::get( 'mediaService' );
}

public function listAction()
{
    // simplified
    $this->view->media = $this->_mediaService->listAllUploadedVideos();
}

Umarım bu sizin için yararlı bir örnektir.