ZF2 Autoloader:在扩展类上也将工厂用于基类

本·多皮尼(Ben Dauphinee)

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

$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)。上面的抽象工厂模式基本上说:给我一个类,我将对其进行反映,以查看它是否是我关心的基类,如果是,我将运行我的工厂来获取它。

有关abstract_factories您以前从未使用过的更多信息

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PHP ZF2:找不到类

来自分类Dev

ZF2注册了无效的工厂

来自分类Dev

ZF2在工厂获取参数

来自分类Dev

ZF2在工厂获取参数

来自分类Dev

ZF2将数据插入Db

来自分类Dev

Resque找不到作业类ZF2命名空间

来自分类Dev

如何在zf2中使用辅助类?

来自分类Dev

使用ZF2更新类更新多个表

来自分类Dev

如何使serviceManager在类zf2上工作

来自分类Dev

在生产中找不到ZF2类

来自分类Dev

ZF2:从控制器工厂更改视图脚本

来自分类Dev

在zf2视图中将$ this用于变量

来自分类Dev

zf2段路线在最后位置上的捕获ID

来自分类Dev

ZF2 +组合键上的重复表格验证

来自分类Dev

使用ZF2更改Doctrine上的DefaultEntityListenerResolver

来自分类Dev

为什么要在ZF2上使用服务?

来自分类Dev

在zf2上使用会话(恢复容器)

来自分类Dev

ZF2上具有集合的FilePrg

来自分类Dev

ZF2 +组合键上的重复表格验证

来自分类Dev

使用ZF2更改Doctrine上的DefaultEntityListenerResolver

来自分类Dev

ZF2如何将变量传递给表单

来自分类Dev

zf2将供应商移至全局目录?

来自分类Dev

如何使用zf2将数据插入mysql?

来自分类Dev

ZF2 将空的发布字段转换为 Null

来自分类Dev

ZF2转换不适用于表单类

来自分类Dev

ZF2:如何将Application ServiceManager配置为自动添加类?

来自分类Dev

ZF2将数据库中的值获取到表单类中

来自分类Dev

ZF2,实现FactoryInterface的类将ServiceLocator实例作为属性传递

来自分类Dev

ZF2将多行补水到应为数组的类的属性中