//Module.php中的一段代码(项目是zend framework2官网上的简单例子)
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);
},
),
);
}
//zend framework3中的样子
public function getServiceConfig()
{
return [
'factories' => [
Model\AlbumTable::class => function($container) {
$tableGateway = $container->get(Model\AlbumTableGateway::class);
return new Model\AlbumTable($tableGateway);
},
Model\AlbumTableGateway::class => function ($container) {
$dbAdapter = $container->get(AdapterInterface::class);
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Model\Album());
return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
},
],
];
}
$sm
是什么类型?
ModelAlbumTableGateway::class
这个怎么理解?整个项目中并没有出现AlbumTableGateway
这个类,只有AlbumTable
这个类
自己找到了一个相似的问题,翻译在下面,翻译在更下面。
来源:Zend Framework 2 中的AlbumTableGateway 用户指南
最好的思考方式是 ServiceManager 的 get() 方法采用键值,而不是类名。键值需要映射到将导致返回类实例的内容。
如果键位于 invokables 部分,那么 ServiceManager 将尝试实例化键指向的字符串,假设它是一个类名:
雷雷如果 key 在工厂部分,那么 ServiceManager 将执行该 key 指向的回调并期望返回一个对象实例:
雷雷一般来说,当您需要做的事情不仅仅是实例化一个类时,您可以使用工厂 - 通常您需要使用另一个依赖项来设置该类。如果您只需要实例化一个类,请使用可调用的。
翻译:
雷雷最好这样想:
ServiceManager
的get()
方法接受一个键
而不是一个类名
,这个键
会去匹配invokables
或factories
中的元素并返回一个创建的对象。ServiceManager
的get()
方法接受一个键
而不是一个类名
,这个键
会去匹配invokables
或factories
中的元素并返回一个创建的对象。如果这个
键
是处于invocables
如果这个键 code> 是一个
invocables
的区域,就会它实例化到匹配的那个类。如果这个
雷雷键
处于工厂里,就会通过键
指向的callback
函数实例化一个对象返回。(如果没有匹配到就报错了)
一般来说,只有当你不仅仅是实例化一个存在的类,而是要去构建一个有其他依赖的类的时候才会使用
factories
,否则的话就用invokables
就好了