0

我正在做一个大型项目,其中数据库有许多表,出于不同的原因在不同的模块中访问这些表。所以想出了使用Service Managerto 指向工厂类的想法,该类将实例化TableGateway模型并根据请求返回它们,从而有效地延迟加载TableGateway模型。

但是我仍然不确定ServiceManager中的工厂是延迟加载还是使用ServiceManager实例化?

即,如果我的配置文件中有类似的内容

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

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

4

1 回答 1

4

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

在配置文件中:

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

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

通过访问服务管理器对象:

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

前段时间写了一篇关于服务管理器的文章,里面有一段关于共享服务的概念(靠近底部),可能对你有用。

于 2013-03-02T19:32:19.017 回答