Maison > Questions et réponses > le corps du texte
//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
De quel type s'agit-il ?
ModelAlbumTableGateway::class
这个怎么理解?整个项目中并没有出现AlbumTableGateway
这个类,只有AlbumTable
Ce cours
PHP中文网2017-05-16 16:45:14
自己找了一个相似的问题,原文在下面,翻译在更下面。
source : AlbumTableGateway dans le guide de l'utilisateur de Zend Framework 2
La meilleure façon d'y penser est que la méthode get() de ServiceManager prend une valeur clé, pas un nom de classe. La valeur clé doit être mappée à quelque chose qui entraînera le retour d'une instance de classe.
Si la clé se trouve dans la section invokables, alors le ServiceManager tentera d'instancier la chaîne vers laquelle pointe la clé en supposant qu'il s'agit d'un nom de classe :
'invokables' => array(
'some_name' => 'My\Mapper\SomeClassName',
),
Si la clé se trouve dans la section des usines, le ServiceManager exécutera le rappel vers lequel pointe la clé et s'attendra à ce qu'une instance d'objet soit renvoyée :
'factories' => array(
'some_name' => function($sm) { return new \My\Mapper\SomeClassName(); },
),
En général, vous utilisez une usine lorsque vous devez faire quelque chose de plus que simplement instancier une classe - vous devez généralement configurer la classe avec une autre dépendance. Si vous avez juste besoin d'instancier une classe, utilisez un invocable.
翻译:
最好这样想:ServiceManager
的get()
方法接受一个键
而不是一个类名
,这个键
会去匹配invokables
或factories
中的元素并返回一个创建的对象。ServiceManager
的get()
方法接受一个键
而不是一个类名
,这个键
会去匹配invokables
或factories
中的元素并返回一个创建的对象。
如果这个键
是处于invocables
的区域, 它就会实例化匹配到的那个类。
'invokables' => array(
'some_name' => 'My\Mapper\SomeClassName',
),
如果这个键
处于工厂里,就会通过键
指向的callback
函数实例化一个对象返回。
'factories' => array(
'some_name' => function($sm) { return new \My\Mapper\SomeClassName(); },
),
(如果都没匹配到就报错了)
一般来说,只有当你不仅仅是实例化一个已存在的类,而是要去构建一个有其他依赖的类的时候才会使用factories
,否则的话就用invokables
如果这个键 code>是处于
invocables
的区域, 它就会实例化匹配到的那个类。
键
处于工厂里,就会通过键
指向的callback
函数实例化一个对象返回。🎜
rrreee
🎜(如果都没匹配到就报错了)🎜一般来说,只有当你不仅仅是实例化一个已存在的类,而是Usines de production ,否则的话就用invokables
就好了🎜