ZF2自动加载磁带机:使用工厂的扩展类的基类,以及(ZF2 Autoloader: Use fact

2019-10-20 13:14发布

如果我想使用相同的工厂,了解我的扩展基类,我希望把基类的工厂到一个名为功能,还是有更好的方法来做到这一点任何一类?

$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',
    ),
);

Answer 1:

如果我下你的问题,你有一大堆的扩展类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 ,你不得不重复同样的功能,每个扩展类(据我所知),这将是一个痛苦的维持(IMO)。 以上基本上是抽象工厂模式说:给我一个班,我会反映它,看它是否是基类的我在乎,如果是这样,我会跑我厂得到它。

关于更多信息abstract_factories如果你以前从未使用过它。



文章来源: ZF2 Autoloader: Use factory for base class on extended classes as well