Zend framework2 zend framework 2服务管理器可调用和工厂之间的差异

Zend framework2 zend framework 2服务管理器可调用和工厂之间的差异,zend-framework2,service-management,Zend Framework2,Service Management,嗨,我是zend framework的新手。试着赶上服务经理。 根据zend框架文档,它说: 工厂,服务名称/工厂类名对的数组。工厂应该是实现Zend\ServiceManager\FactoryInterface的类或可调用类。如果您使用的是PHP配置文件,则可以提供任何可作为工厂调用的PHP 可调用的,一组服务名/类名对。类名应该是可以不使用任何构造函数参数直接实例化的类 但我还是不明白他们之间的不同。 何时应使用as可调用,何时应使用工厂?使用工厂的优势是什么? 非常感谢。应使用可调用项实

嗨,我是zend framework的新手。试着赶上服务经理。 根据zend框架文档,它说:

工厂,服务名称/工厂类名对的数组。工厂应该是实现Zend\ServiceManager\FactoryInterface的类或可调用类。如果您使用的是PHP配置文件,则可以提供任何可作为工厂调用的PHP

可调用的,一组服务名/类名对。类名应该是可以不使用任何构造函数参数直接实例化的类

但我还是不明白他们之间的不同。 何时应使用as可调用,何时应使用工厂?使用工厂的优势是什么?
非常感谢。

应使用可调用项实例化sinmple对象,该对象不需要contstructor中的任何其他依赖项等

当实例化对象后有更复杂的逻辑时,应该使用工厂。将代码移动到工厂将节省您在需要返回对象时复制代码的时间

工厂示例:

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

如果您想要返回一个简单的类/对象,那么您可以只使用一个可调用的类/对象,因为不需要锅炉板代码来获取该对象

'invokables' => array(
    'MyClass'          => 'Application\Model\MyClass',
另一个示例,使用控制器:

如果您有一个简单的控制器,没有要求的依赖项,请使用可调用的:

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

如果我有工厂,是否必须使用FactoryInterface?如果我调用工厂类构造函数
\uuu\u
,这是一种糟糕的形式吗?