2013-05-24 2 views
11

Привет, я новичок в zend framework. попытайтесь догнать менеджера сервиса. Основание на документации по основанию zend, сказано:zend framework 2 Разница между менеджерами сервисов между invokables и фабриками

фабрики, массив имен услуг/пар названия фабричных классов. Заводы должны быть либо классами, реализующими Zend \ ServiceManager \ FactoryInterface, либо invokable classes. Если вы используете файлы конфигурации PHP, вы можете указать любой PHP, который можно назвать фабрикой.

invokables, массив пар имен услуг/классов. Имя класса должно быть классом, который может быть непосредственно создан без каких-либо аргументов конструктора.

, но я все еще не ухожу, понимая, что разные между ними. , когда я должен использовать как вызываемый, и когда я должен использовать заводы? что выгодно использовать заводы? Большое спасибо.

ответ

22

Invokables следует использовать для создания экземпляра целостного объекта, который не требует каких-либо других зависимостей и т. Д. В контрструкторе.

Вы должны использовать завод, если для создания объекта требуется немного более сложная логика. Перемещение кода на фабрику позволит вам дублировать код, когда вам понадобится еще один объект.

завод пример:

'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; 
    } 

}

Если вы хотите вернуться простой класс/объект тогда вы можете просто использовать invokable, так как там нет код котельной пластины, необходимый для возврата объекта назад.

'invokables' => array(
    'MyClass'   => 'Application\Model\MyClass', 

другой пример, с контроллерами:

Если у вас есть простой контроллер, без requried зависимостей используйте invokable:

'invokables' => array(
    'index'   => 'Mis\Controller\IndexController', 

Но иногда вы хотите добавить дополнительные зависимости к контроллер при его создании:

'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

Если у меня есть Фабрика, обязательно использовать Фа ctoryInterface? Является ли эта плохая форма, если я создаю конструктор класса Factory '__invoke'? – Erik

Смежные вопросы