如果我想对扩展我的基类的任何类使用相同的工厂,是否要将基类工厂转换为命名函数,或者有更好的方法吗?
$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' ] ];
使用concrete时factories
,您必须对每个扩展类(AFAIK)重复相同的功能,这很难维护(IMO)。上面的抽象工厂模式基本上说:给我一个类,我将对其进行反映,以查看它是否是我关心的基类,如果是,我将运行我的工厂来获取它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句