//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
是什麼型別?
Model\AlbumTableGateway::class
這個怎麼理解?整個專案中並沒有出現AlbumTableGateway
這個類,只有AlbumTable
這個類別
PHP中文网2017-05-16 16:45:14
自己找到了一個相似的問題,翻譯在下面,翻譯在更下面。
來源: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
就好了