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)。上面的抽象工厂模式基本上是这样的:给我一个类,我将反映它,看看它是否是我关心的基类,如果是,我将运行我的工厂来获得它