2013-11-28 28 views
5

ZF2'yi kullanmaya başladım ve gerçekten keyif alıyorum.ZF2 için Zend Registry'ye alternatifler

Beni biraz şaşırtan bir şey, bir Kayıt Defteri bileşeninin olmamasıdır. Hizmet Yöneticisi'nin çoğu durumda Kayıt Defterini geçersiz kıldığını fark ettim. Ona çok güveniyorum ve harika.

Ama zaman kendimi 'küresel' nesnesine erişim gerektiren ve ben Servis Yöneticisi erişimi olmayan bulmak zaman

. Örneğin, Etki Alanı \ Kullanıcı nesnesinde bir Zend \ Log'a erişmem gerekiyor. bu tür hususlardan güzel ve bozulmamış ve katkısız olması nedeniyle

benim Alan nesneleri Service Manager kullanılabilir yapmak istemiyoruz. Gerektiğinde bir günlük örneğini 'yeni' yapabilirdim, ancak bunu sık sık yaptığım için önceden yapılandırılmış bir örneği elimde bulundurmayı tercih ederim. Onu bir singletonda sarabilirdim, ama bu geriye doğru bir adım gibi görünüyor. Kendi mini kayıt defterimi oluşturabilirdim, ama bu iyi bir fikir olsaydı, Zend'lerin böyle bir bileşeni yerinde bırakacaklarına eminim.

Peki, başka hangi seçenekler var?

DÜZENLEME: Yani

, ben Zend DI belki kullanabilirsiniz? Ben Configuring class alias for using with Zend\Di\Di

+4

"Doğru" yöntem, Log nesnesini Etki Alanı \ Kullanıcı nesnesine bağımlılık olarak iletmektir. Günlüğe kaydetme, normalde etki alanı modellerinde yapacağınız bir şey değil - neden buna ihtiyacınız hakkında biraz daha açıklayabilir misiniz? –

+0

Merhaba Tim, sadece bir değişken var_dump veya print_r almak için kullanın. Sadece hata ayıklamak için. –

+0

Düzenleme sesleriniz güzel - Zend \ Di \ Di, nesne yapımındaki bağımlılığı incitmeye güzel bir alternatif gibi görünüyor. Ancak, bahsettiğiniz gibi, bu sadece (bağımlılık gibi) gerçek bir bağımlılık değilse yapılmalıdır. – P0rnflake

cevap

3

Tam olarak bağımlılık enjeksiyon sorununu ele vardır, bu soru kısmen kapsar görüyoruz. Sana bir Kaydedici gibi soft dependencies varsa nasıl refactor towards dependency injection ve ne daha önce bu konu hakkında blogged var.

fikir önceden yapılandırılmış logger enjekte olduğunu. Domain \ User nesnesiniz oluşturulduğunda, günlükçüye enjekte edilir. Bu, Etki Alanı \ Kullanıcı nesnesini, yalnızca kaydediciyi nasıl oluşturacağına dair bilgi sahibi olmadan, kaydediciye bağımlı kılar. Bir Logger arayüzüne güveniyorsanız daha da iyidir, böylece istediğiniz herhangi bir logger uygulamasına geçebilirsiniz. Örnek olarak

Örnek, ben Zend \ Log kullandığınız varsayılmaktadır. Bağlı çeşitli yazarlar ile Zend\Log\Logger gibi bir Logger var. Kaydedici, Zend\Log\LoggerInterface'u uygular.

Alan \ Kullanıcı sınıfı:

namespace Domain; 

Zend\Log\LoggerInterface; 

class User 
{ 
    protected $logger; 

    public function __construct(LoggerInterface $logger) 
    { 
     $this->logger = $logger; 
    } 

    public function doSomething() 
    { 
     $this->logger->info('Do Something'); 

     // 
    } 
} 

Zend Framework için, size nesneler içine bu logger enjekte fabrikalar birlikte çalışmalıdır. En iyi yol, Logger'ı bir hizmet olarak tanımlamaktır, çünkü diğer nesneler için de logger'ı tekrar kullanabilirsiniz.

Not ben Servis Yöneticisi ve burada Zend \ Di kullanın. Zend \ Di eski ve daha hızlı ve daha esnek Zend \ ServiceManager ile değiştirilir. Her ikisi de bağımlılık enjeksiyonunu sağlayabilir.

sen logger için fabrika:

namespace MyModule\Factory; 

use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 

use Zend\Log\Logger; 

class LoggerFactory implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $logger = new Logger; 
     // do more with $logger here 

     return $logger; 
    } 
} 

Sonra sizin için hizmet "logger" oluşturmak için bu fabrikayı kayıt. senin module.config.php olarak:

'service_manager' => array(
    'factories' => array(
     'logger' => 'MyModule\Factory\LoggerFactory', 
    ), 
), 

Şimdi logger servis yemlik mevcuttur. Etki alanı modeliniz için aynısını yapın.İlk bir fabrika oluşturma: hizmet bulucu erişiminiz varsa

'service_manager' => array(
    'factories' => array(
     'logger' => 'MyModule\Factory\LoggerFactory', 
     'Domain\User' => 'MyModule\Factory\UserFactory', 
    ), 
), 

Domain \ User alabilir ve kaydedici otomatik olarak enjekte edilir:

namespace MyModule\Factory; 

use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 

use Domain\User; 

class UserFactory implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $logger = $serviceLocator->get('logger'); 

     $user = new User($logger); 
     return $user; 
    } 
} 

Sonra bunu da kayıt

$user = $sl->get('Domain\User');