Подтвердить что ты не робот

Zend framework 2 Разница между диспетчерами между invokables и фабриками

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

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

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

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

4b9b3361

Ответ 1

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

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

Factory пример:

    '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 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',

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

Если у вас есть простой контроллер, без каких-либо дополнительных зависимостей, используйте 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;
        },