//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
Apakah jenisnya?
ModelAlbumTableGateway::class
这个怎么理解?整个项目中并没有出现AlbumTableGateway
这个类,只有AlbumTable
Kelas ini
自己找了一个相似的问题,原文在下面,翻译在更下面。
sumber: AlbumTableGateway dalam Panduan Pengguna Zend Framework 2
Cara terbaik untuk memikirkan perkara ini ialah kaedah get() ServiceManager mengambil nilai kunci, bukan nama kelas. Nilai utama perlu dipetakan kepada sesuatu yang akan menyebabkan contoh kelas dikembalikan.
Jika kunci berada dalam bahagian invokables, maka ServiceManager akan cuba membuat instantiat rentetan yang ditunjuk oleh kunci dengan andaian bahawa ia adalah nama kelas:
Jika kunci berada dalam bahagian kilang, maka ServiceManager akan melaksanakan panggilan balik yang dituju oleh kunci dan mengharapkan contoh objek dikembalikan:
Secara umum, anda menggunakan kilang apabila anda perlu melakukan sesuatu yang lebih daripada sekadar membuat kelas - biasanya anda perlu menyediakan kelas dengan pergantungan lain. Jika anda hanya perlu membuat instantiate kelas, gunakan invokable.
翻译:invokable或kilang中的元素并返回一个创建的对象。
最好这样想:
ServiceManager
的get()
方法接受一个键
而不是不类天,这个键
会去匹配ServiceManager
的get()
方法接受一个键
而不是一个类名
,这个键
会去匹配invokables
或factories
中的元素并返回一个创建的对象。如果这个
键
是处于invocables
的区域, 它就会实例化匹配到的那个类。如果这个
键
处于工厂里,就会通过键
指向的callback
函数实例化一个对象返回。(如果都没匹配到就报错了)键中文kod>是处于invocable的区域, 它就会实例化匹配到的那个类。
rrreee 🎜如果这个一般来说,只有当你不仅仅是实例化一个已存在的类,而是要去构建一个有其他依赖的类的时候才会使用
factories
,否则的话就用invokables