Если бы я хотел использовать ту же фабрику для любого класса, который расширил мой базовый класс, хотел бы я превратить фабрику базового класса в именованную функцию или есть лучший способ сделать это?
$serviceManager => array( 'factories' => array( 'someBaseClass' => function($thisServiceManager) { $db = $thisServiceManager->get('db'); $thisBaseClass = new \myNamespace\thisBaseClass($db); return $thisBaseClass; }, ), );
РЕДАКТИРОВАТЬ
В дополнение к ответу, который я принял, вот код, который я тестировал, работает.
Файл класса
use Zend\ServiceManager\AbstractFactoryInterface; use Zend\ServiceManager\ServiceLocatorInterface; class baseClassFactory implements \Zend\ServiceManager\AbstractFactoryInterface { public function canCreateServiceWithName (ServiceLocatorInterface $locator, $name, $requestedName = '') { return ('baseClass' === $name || is_subclass_of($name, 'baseClass')); } public function createServiceWithName (ServiceLocatorInterface $locator, $name, $requestedName = '') { $db = $locator->get('db'); $query = new $name($db); return $query; } }
конфигурация
$serviceManager => array( 'abstract_factories' => array( 'baseClassFactory', ), );
Если я следую вашему вопросу, у вас есть куча классов, которые расширяют someBaseClass
, и вы хотите, чтобы все они были изготовлены таким же образом?
Если это так, то это звучит как хорошая возможность использовать компонент abstract_factories
в ServiceManager
. Псевдокод будет выглядеть так:
// warning: untested pseudo-code class MyAbstractFactory implements \Zend\ServiceManager\AbstractFactoryInterface { public function canCreateServiceWithName($_, $_, $name) { // if I'm asked for someBaseClass or a child of someBaseClass, return true: false otherwise return ('someBaseClass' === $name || is_subclass_of($name, 'someBaseClass')); } public function createServiceWithName($locator, $_, $name) { // your factory logic here // $object = ... return $object; } }
И ваша конфигурация будет выглядеть так:
$serviceManager = [ 'abstract_factories' => [ 'MyAbstractFactory' ] ];
Используя конкретные factories
, вам придется повторять ту же функцию для каждого расширенного класса (AFAIK), что было бы болью для поддержания (IMO). Абстрактный шаблон фабрики выше в основном говорит: дайте мне класс, я задумаю, будет ли это базовый класс, о котором я забочусь, и если да, я запустил свою фабрику, чтобы получить его.
Больше информации о abstract_factories
если вы никогда не использовали его раньше.