Zend Framework - Servis Yöneticisi

Zend Çerçevesi, adı verilen güçlü bir servis bulucu model uygulaması içerir. zend-servicemanager. Zend çerçevesi, tüm işlevleri için hizmet yöneticisini kapsamlı bir şekilde kullanır. Service Manager, Zend Framework için yüksek düzeyde bir soyutlama sağlar. Aynı zamanda Zend Framework'ün diğer tüm bileşenleri ile güzel bir şekilde bütünleşir.

Service Manager'ı yükleyin

Service Manager bileşeni, composer aracı.

composer require zendframework/zend-servicemanager

Misal

Öncelikle, tüm hizmetlerin servis yöneticisine kaydedilmesi gerekir. Hizmetler sunucu yöneticisi sistemine kaydedildikten sonra, minimum çabayla herhangi bir zamanda erişilebilir. Servis yöneticisi, servisi kaydetmek için birçok seçenek sunar. Basit bir örnek aşağıdaki gibidir -

use Zend\ServiceManager\ServiceManager; 
use Zend\ServiceManager\Factory\InvokableFactory; 
use stdClass;  
$serviceManager = new ServiceManager([ 
   'factories' => [stdClass::class => InvokableFactory::class,], 
]);

Yukarıdaki kod, stdClass kullanarak sisteme Factoryseçeneği. Şimdi, stdClass'ın bir örneğini herhangi bir zamandaget() Servis yöneticisinin yöntemi aşağıda gösterildiği gibi.

use Zend\ServiceManager\ServiceManager;  
$object = $serviceManager->get(stdClass::class);

Get () yöntemi, alınan nesneyi paylaşır ve bu nedenle, get () yöntemini birden çok kez çağırarak döndürülen nesne bir ve aynı örnektir. Her seferinde farklı bir örnek almak için, servis yöneticisi başka bir yöntem sağlar;build() yöntem.

use Zend\ServiceManager\ServiceManager;  
$a = $serviceManager->build(stdClass::class); $b = $serviceManager->build(stdClass::class);

Servis Yöneticisi Kaydı

Servis yöneticisi, bir bileşeni kaydetmek için bir dizi yöntem sağlar. En önemli yöntemlerden bazıları aşağıda verilmiştir -

  • Fabrika yöntemi
  • Soyut fabrika yöntemi
  • Başlatıcı yöntemi
  • Temsilci fabrika yöntemi

Bunların her birini ilerideki bölümlerde ayrıntılı olarak tartışacağız.

Fabrika Yöntemi

Bir fabrika, temelde herhangi bir çağrılabilir veya FactoryInterface (Zend \ ServiceManager \ Factory \ FactoryInterface).

FactoryInterface'in tek bir yöntemi vardır -

public function __invoke(ContainerInterface $container, $requestedName, array $options = null)

FactoryInterface'in argüman detayları aşağıdaki gibidir -

  • container (ContainerInterface)- ServiceManager'ın temel arayüzüdür. Diğer hizmetleri alma seçeneği sunar.

  • requestedName - Hizmet adıdır.

  • options - Servis için ihtiyaç duyulan ek seçenekleri sunar.

FactoryInterface'i uygulayan basit bir sınıf oluşturalım ve sınıfı nasıl kaydedeceğimizi görelim.

Sınıf Testi - Alınacak Nesne

use stdClass;  
class Test { 
   public function __construct(stdClass $sc) { // use $sc 
   } 
}

Test sınıf stdClass'a bağlıdır.

Class TestFactory - Test Nesnesini Başlatacak Sınıf

class TestFactory implements FactoryInterface { 
   public function __invoke(ContainerInterface $container, $requestedName, 
      array $options = null) { $dep = $container->get(stdClass::class); return new Test($dep); 
   } 
}

TestFactory stdClass'ı almak için bir kap kullanır, Test sınıfının örneğini oluşturur ve onu döndürür.

Zend Framework Kaydı ve Kullanımı

Şimdi Zend Framework'ün nasıl kaydedileceğini ve kullanılacağını anlayalım.

serviceManager $sc = new ServiceManager([ 'factories' => [stdClass::class => InvokableFactory::class, Test::class => TestFactory::class] ]); $test = $sc->get(Test::class);

Servis yöneticisi adında özel bir fabrika sağlar InvokableFactorybağımlılığı olmayan herhangi bir sınıfı almak için. Örneğin,stdClass stdClass başka herhangi bir sınıfa bağlı olmadığından InvokableFactory kullanılarak yapılandırılabilir.

serviceManager $sc = new ServiceManager([ 
   'factories' => [stdClass::class => InvokableFactory::class] 
]);  
$stdC = $sc->get(stdClass::class);

Uygulamadan bir nesneyi almanın başka bir yolu FactoryInterface veya kullanarak InvokableFactory aşağıda verilen satır içi yöntemi kullanıyor.

$serviceManager = new ServiceManager([ 'factories' => [ stdClass::class => InvokableFactory::class, Test::class => function(ContainerInterface $container, $requestedName) { $dep = $container->get(stdClass::class); return new Test($dep); 
      }, 
   ], 
]);

Soyut Fabrika Yöntemi

Bazen, yalnızca çalışma zamanında bildiğimiz nesneler yaratmamız gerekebilir. Bu durum,AbstractFactoryInterface, FactoryInterface'ten türetilen.

AbstractFactoryInterface, nesnenin istenen örnekte yaratılıp yaratılamayacağını kontrol etmek için bir yöntem tanımlar. Nesne oluşturma mümkünse, nesneyi kullanarak oluşturacaktır.__invokemethod FactoryInterface'i seçin ve iade edin.

AbstractFactoryInterface'in imzası aşağıdaki gibidir -

public function canCreate(ContainerInterface $container, $requestedName)

Başlatıcı Yöntemi

Başlatıcı Yöntemi, önceden oluşturulmuş hizmetler için ek bağımlılık enjekte etmek için özel bir seçenektir. UygularInitializerInterface ve mevcut tek yöntemin imzası aşağıdaki gibidir -

public function(ContainerInterface $container, $instance)  
function(ContainerInterface $container, $instance) { 
   if (! $instance instanceof EventManagerAwareInterface) { return; } $instance->setEventManager($container->get(EventManager::class)); 
}

Yukarıdaki örnekte, yöntem, örneğin EventManagerAwareInterface türünde olup olmadığını kontrol eder. Eğer tipteyseEventManagerAwareInterface, olay yöneticisi nesnesini ayarlar, aksi takdirde ayarlamaz. Yöntem bağımlılığı ayarlayabilir veya ayarlamayabilir, güvenilir değildir ve birçok çalışma zamanı sorunu üretir.

Yetkilendiren Fabrika Yöntemi

Zend Framework, delege modelini destekler DelegatorFactoryInterface. Hizmeti süslemek için kullanılabilir.

Bu işlevin imzası aşağıdaki gibidir -

public function __invoke(ContainerInterface $container, 
   $name, callable $callback, array $options = null 
);

Burada $callback hizmet örneğinin dekorasyonundan sorumludur.

Tembel Hizmetler

Tembel hizmet, oluşturulma sırasında tam olarak başlatılmayacak hizmetlerden biridir. Sadece referans verilir ve sadece gerçekten ihtiyaç duyulduğunda başlatılır. En iyi örneklerden biri, her yerde ihtiyaç duyulmayabilecek veritabanı bağlantısıdır. Pahalı bir kaynaktır ve oluşturulması zaman alan bir süreçtir. Zend çerçevesi sağlarLazyServiceFactory dan türetilmiş DelegatorFactoryInterfaceyardımıyla tembel hizmet üretebilen Delegator kavram ve bir 3. taraf proxy yöneticisi; ocramius proxy manager.

eklenti Yöneticisi

Eklenti Yöneticisi, hizmet yöneticisini genişletir ve örnek doğrulama gibi ek işlevler sağlar. Zend Framework, eklenti yöneticisini kapsamlı bir şekilde kullanır.

Örneğin, tüm doğrulama hizmetleri, ValidationPluginManager.

Yapılandırma Seçeneği

Servis yöneticisi, bir servis yöneticisinin özelliğini genişletmek için bazı seçenekler sunar. Onlarshared, shared_by_default ve aliases. Daha önce tartıştığımız gibi, alınan nesneler varsayılan olarak istenen nesneler arasında paylaşılır ve bunu kullanabiliriz.build()farklı bir nesne elde etme yöntemi. Ayrıca kullanabilirizsharedhangi hizmetin paylaşılacağını belirleme seçeneği. shared_by_default ile aynı shared özelliği, tüm hizmetler için geçerli olması dışında.

$serviceManager = new ServiceManager([ 
   'factories' => [ 
      stdClass::class => InvokableFactory::class 
   ], 
   'shared' => [ 
      stdClass::class => false // will not be shared 
   ], 
   'shared_by_default' => false, // will not be shared and applies to all service 
]);

aliasesseçeneği, kayıtlı hizmetlere alternatif bir ad sağlamak için kullanılabilir. Bunun hem avantajları hem de dezavantajları vardır. Olumlu tarafı, bir hizmet için alternatif kısa isimler sağlayabiliriz. Ancak, aynı zamanda ad bağlam dışına çıkabilir ve hatalar ortaya çıkarabilir.

aliases' => ['std' => stdClass::class, 'standard' => 'std']