我正在开发一个大型项目,其中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')
?
答案 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,其中包含一个关于共享服务概念的部分(靠近底部),这可能对您有用。