Zend Framework 2 Разница в менеджере сервисов между invokables и фабриками
Привет, я новичок в Zend Framework. попробуйте догнать менеджера сервиса. Основываясь на документации Zend Framework, он сказал:
фабрики, массив пар имя службы / имя класса фабрики. Фабрики должны быть либо классами, реализующими Zend\ServiceManager\FactoryInterface, либо вызываемыми классами. Если вы используете файлы конфигурации PHP, вы можете предоставить любой вызываемый PHP как фабрику.
invokables, массив пар имя службы / имя класса. Имя класса должно быть классом, который может быть создан непосредственно без аргументов конструктора.
но я все еще не ухожу, чтобы понять разницу между ними. когда я должен использовать как invokeable и когда я должен использовать фабрики? В чем преимущество использования фабрики? Спасибо большое.
1 ответ
Вызываемые должны использоваться для создания экземпляра простого объекта, который не нуждается в каких-либо других зависимостях и т. Д. В 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;
}
}
Если вы хотите вернуть простой класс / объект обратно, тогда вы можете просто использовать 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;
},