2013-05-24 5 views
11

Hallo ich bin neu in Zend Framework. versuchen Sie, den Service Manager nachzuholen. Basis auf der Zend-Framework-Dokumentation, hieß es:zend Framework 2 Service Manager Unterschied zwischen Invokables und Fabriken

Fabriken, eine Reihe von Service Name/Factory-Class-Namen-Paare. Die Fabriken sollten entweder Klassen sein, die Zend \ ServiceManager \ FactoryInterface oder aufrufbare Klassen implementieren. Wenn Sie PHP-Konfigurationsdateien verwenden, können Sie PHP als Factory zur Verfügung stellen.

invokables, ein Array von Dienstnamen/Klassennamenpaaren. Der Klassenname sollte eine Klasse sein, die direkt ohne Konstruktorargumente instanziiert werden kann.

aber ich bin immer noch nicht aufhören zu verstehen, die Unterschiede zwischen ihnen. Wann sollte ich als invokeable verwenden und wann sollte ich Fabriken nutzen? Was ist ein Vorteil, Fabriken zu nutzen? vielen Dank.

Antwort

22

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; 
     }, 
+0

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