Sto lavorando in Zend framework 1 e stavo usando Zend_Registry per archiviare gli oggetti in modo che potessi sostituirli nei miei controller mentre test delle unità:
$auth = Zend_Registry::get('Auth'); // set in Bootstrap.php
Volevo memorizzare le chiusure che potevano essere eseguite quando erano richieste (piuttosto che tutte durante Booostrtap anche se non erano utilizzate in quella richiesta), ma il Registro non sembra farlo. Immagino che prima delle 5.3 non ci fossero chiusure?
Quindi, ho creato la mia classe di localizzatore di servizi. Ho pensato di estendere Zend_Registry ma preferisco avere qualcosa che possa essere usato al di fuori di ZF1, in più è piuttosto semplice in ogni caso:
<?php
class App_Services
{
/**
* @var array $container will store our services
*/
private $container = array();
/**
* Returns the *Singleton* instance of this class.
*
* @staticvar Singleton $instance The *Singleton* instances of this class.
*
* @return Singleton The *Singleton* instance.
*/
public static function getInstance()
{
static $instance = null;
if (null === $instance) {
$instance = new App_Services();
}
return $instance;
}
/**
* Get a service from the container
*
* @param string $name Index of the service in container
* @return various Service
*/
public function get($id)
{
$instance = self::getInstance();
// if not set, return null
if (! isset($instance->container[$id]))
return null;
// if a closure, call it and return the return value
if ($instance->container[$id] instanceof \Closure) {
$instance->container[$id] = $instance->container[$id]();
return $instance->container[$id];
}
return $instance->container[$id];
}
/**
* Set a service in the container
*
* @param string $id Name (index) of the service in container
* @param string $service Service to store
*/
public function set($id, $service)
{
$instance = self::getInstance();
$instance->container[$id] = $service;
}
}
.. e su Bootstrap posso fare:
$auth = App_Services::set('Auth', function() {
return new Auth();
});
.. quindi entro le azioni del mio controller che posso fare:
$auth = App_Service::get('Auth');
.. come prima.
In ogni caso, si tratta di una buona implementazione di un localizzatore di servizi? Inoltre, questo o Zend_Registry può essere utilizzato come un localizzatore di servizi? Mi piacerebbe capire meglio il pattern mentre leggo che il pattern di localizzatore di servizi è una buona idea, poi ho letto che è un pattern anti, ma penso che alcune volte dipenda da come sono implementati i pattern che rendono poi buoni pattern o anti pattern. Apprezzerei qualsiasi consiglio su questo, grazie.