Die Invokables sollten verwendet werden, um ein einzelnes Objekt zu instanziieren, das keine anderen Abhängigkeiten usw. im Konstruktor benötigt.
Sie sollten eine Fabrik verwenden, wenn es eine etwas komplexere Logik hinter der Instanziierung des Objekts gibt. Wenn Sie den Code in eine Factory verschieben, können Sie den Code duplizieren, wenn Sie auch ein Objekt benötigen.
Fabrik Beispiel:
'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;
}
}
Wenn Sie wieder eine einfache Klasse wollen/Objekt zurück, dann können Sie nur ein aufrufbares verwenden, da gibt es kein Code für die Kesselplatte benötigt, um das Objekt zurück zu bekommen.
'invokables' => array(
'MyClass' => 'Application\Model\MyClass',
ein weiteres Beispiel, mit Controllern:
Wenn Sie einen einfachen Controller verfügen, ohne requried Abhängigkeiten, ein aufrufbares verwenden:
'invokables' => array(
'index' => 'Mis\Controller\IndexController',
Aber manchmal will man zusätzliche Abhängigkeiten der hinzufügen Controller, wenn Sie es instanziieren:
'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;
},
Wenn ich eine Fabrik habe, ist es obligatorisch, die Fa zu verwenden ctoryInterface? Ist das eine schlechte Form, wenn ich den Factory-Konstruktor "__invoke" mache? – Erik