Php ZF2自动加载器:对扩展类上的基类也使用factory

Php ZF2自动加载器:对扩展类上的基类也使用factory,php,class,zend-framework2,factory,Php,Class,Zend Framework2,Factory,如果我想对扩展基类的任何类使用相同的工厂,我是想将基类工厂转换为命名函数,还是有更好的方法 $serviceManager => array( 'factories' => array( 'someBaseClass' => function($thisServiceManager) { $db = $thisServiceManager->get('db'); $thisBaseClass = ne

如果我想对扩展基类的任何类使用相同的工厂,我是想将基类工厂转换为命名函数,还是有更好的方法

$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
,你希望它们都以相同的方式制造吗

如果是这样,那么这听起来是使用
ServiceManager
中的
abstract\u factories
组件的好机会。伪代码如下所示:

// 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' ] ];
使用具体的
工厂
,您必须为每个扩展类(AFAIK)重复相同的函数,这将是一个维护的难题(IMO)。上面的抽象工厂模式基本上是这样的:给我一个类,我将反映它,看看它是否是我关心的基类,如果是,我将运行我的工厂来获得它