【问题标题】:ZF2 Autoloader: Use factory for base class on extended classes as wellZF2 Autoloader:在扩展类上也使用工厂作为基类
【发布时间】:2014-07-27 15:01:39
【问题描述】:

如果我想对扩展我的基类的任何类使用相同的工厂,我是否想把基类工厂变成一个命名函数,还是有更好的方法来做到这一点?

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

【问题讨论】:

    标签: php class zend-framework2 factory


    【解决方案1】:

    如果我在关注您的问题,您有一堆扩展 someBaseClass 的类,并且您希望它们都以相同的方式制造?

    如果是这样,那么这听起来像是在ServiceManager 中使用abstract_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' ] ];
    

    使用具体的 factories,您必须为每个扩展类 (AFAIK) 重复相同的功能,这将很难维护 (IMO)。上面的抽象工厂模式基本上就是说:给我一个类,我会反映它,看看它是否是我关心的基类,如果是,我会运行我的工厂来获取它。

    More info on abstract_factories if you've never used it before.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多