在Zend Framework 2用户指南的专辑示例中,模型配置如下:
<?php
namespace Album;
// Add these import statements:
use Album\Model\Album;
use Album\Model\AlbumTable;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;
class Module
{
// getAutoloaderConfig() and getConfig() methods here
// Add this method:
public function getServiceConfig()
{
return array(
'factories' => array(
'Album\Model\AlbumTable' => function($sm) {
$tableGateway = $sm->get('AlbumTableGateway');
$table = new AlbumTable($tableGateway);
return $table;
},
'AlbumTableGateway' => function ($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Album());
return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
},
),
);
}
}
变量$sm
是Zend\ServiceManager\ServiceManager
个对象。但是如何/何时/何地创建/初始化?
编辑:
我想知道的是:$sm
如何/在哪里获取其值(并成为ServiceManager对象)。
答案 0 :(得分:1)
当您从服务管理器检索服务时,如果它是工厂,它会将自身的实例作为第一个参数传递给负责创建服务的任何可调用者,这通常是一个闭包(如示例中所示) ),或工厂类的createService方法。
对于工厂,这是通过此处的代码https://github.com/zendframework/zf2/blob/master/library/Zend/ServiceManager/ServiceManager.php#L859
完成的基本上,在您的模块中,您告诉ServiceManager这些服务是通过调用您提供的闭包来创建的。当你第一次向ServiceManager询问get()
其中一个时,它会确定它是一个工厂(它是在配置中的工厂密钥中提供的),然后弄清楚它是一个闭包还是一个FactoryInterface的实例(工厂类),最后适当地调用它来实例化你的服务。