zend framework2 - zend framework 2 service manager diferencia entre invokables y fábricas
zend-framework2 service-management (1)
Hola, soy nuevo en Zend Framework. Intenta ponerte al día con el administrador del servicio. basado en la documentación de zend framework, dijo:
fábricas , una matriz de pares de nombre de servicio / nombre de clase de fábrica. Las fábricas deben ser clases que implementen Zend / ServiceManager / FactoryInterface o clases invocables. Si está utilizando archivos de configuración PHP, puede proporcionar cualquier PHP invocable como fábrica.
invokables , una matriz de pares de nombre de servicio / nombre de clase. El nombre de la clase debe ser una clase que pueda ser instanciada directamente sin ningún argumento de constructor.
pero sigo sin dejar de entender las diferencias entre ellos. cuando debería usar como invocable y cuando debería usar fábricas? ¿Cuál es la ventaja de usar fábricas? muchas gracias.
Los invokables se deben usar para crear instancias de un objeto sinmple, que no necesita ninguna otra dependencia, etc. en el contstructor.
Debería usar una fábrica cuando exista una lógica un poco más compleja detrás de la instancia del objeto. Mover el código a una fábrica le ahorrará la duplicación del código cuando necesite recuperar un objeto.
Ejemplo de fábrica:
''factories'' => array(
''Application/Acl'' => ''Application/Service/AclFactory'',
AclFactory.php
namespace Application/Service;
use Zend/ServiceManager/FactoryInterface;
use Zend/ServiceManager/ServiceLocatorInterface;
use Zend/Permissions/Acl/Resource/GenericResource;
use Zend/Permissions/Acl/Role/GenericRole;
class AclFactory implements FactoryInterface
{
/**
* Create a new ACL Instance
*
* @param ServiceLocatorInterface $serviceLocator
* @return Demande
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
$acl = new /Zend/Permissions/Acl/Acl();
/**
* Here you can setup Resources, Roles or some other stuff.
* If it''s complex you can make a factory like this to keep
* the code out of the service config, and it will save you
* having to duplicate the code when ever you need your ACL
*/
return $acl;
}
}
Si desea recuperar una clase / objeto simple, puede usar un invocable, ya que no es necesario un código de placa de caldera para recuperar el objeto.
''invokables'' => array(
''MyClass'' => ''Application/Model/MyClass'',
otro ejemplo, con controladores:
Si tiene un controlador simple, sin dependencias requeridas, use un invocable:
''invokables'' => array(
''index'' => ''Mis/Controller/IndexController'',
Pero a veces desea agregar dependencias adicionales al controlador cuando crea una instancia:
''factories'' => array(
/**
* This could also be added as a Factory as in the example above to
* move this code out of the config file..
*/
//''users'' => ''Application/Service/UsersControllerFactory'',
''users'' => function($sm) {
$controller = new /Application/Controller/UsersController();
$controller->setMapper($sm->getServiceLocator()->get(''UserMapper''));
$controller->setForm($sm->getServiceLocator()->get(''UserForm''));
return $controller;
},