存储ZF2 ServiceManager工厂对象实例还是Lazy Loaded?

时间:2013-03-01 18:13:30

标签: lazy-loading zend-framework2 service-locator

我正在开发一个大型项目,其中DB有许多表,这些表可以出于不同的原因在不同的模块中访问。因此想出了使用Service Manager指向Factory类的想法,这些类将实例化TableGateway模型并根据请求返回它们,有效地延迟加载TableGateway模型。

但是我仍然不确定ServiceManager中的工厂是否延迟加载或者是否使用ServiceManager进行实例化?

即,如果我在配置文件中有这样的东西

array(
    'service_manager' => array(
        'factories => array(
            'giftcard_table' => 'Giftcard\Factory\GiftcardTableFactory',
        ),
    ),
);

每次拨打Giftcard\Factory\GiftcardTableFactory时都会创建$sm->get('giftcard_table')的新实例吗?或者这是在每个HTTP请求开始时与ServiceManager一起实例化的内容,无论我是否调用$sm->get('giftcard_table')

1 个答案:

答案 0 :(得分:4)

当您通过服务管理器的get方法请求工厂时,工厂将被实例化。此方法调用create方法,该方法在请求工厂时调用createFromFactory方法。根据最后一个链接上突出显示的行,您可以看到它确实在请求时实例化工厂。您还可以看到它存储工厂。这是因为默认情况下共享从服务​​管理器获取的服务。共享意味着将在后续请求中返回相同的实例。您可以将其视为缓存。如果您愿意,可以disable this,以便在每次请求时创建给定服务的实例。

在配置文件中:

// Some configuration omitted
'service_manager' => array(
    /* ... */

    'shared' => array(
        'MyFactory' => false,
    )
);

访问服务管理器对象:

$service_manager->setShared('MyFactory', false);

前段时间我写了an article about the service manager,其中包含一个关于共享服务概念的部分(靠近底部),这可能对您有用。