Автозагрузчик ZF2: используйте фабрику для базового класса на расширенных классах

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

$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 если вы никогда не использовали его раньше.