AlbumTableGateway в Zend Framework 2 Руководство пользователя
В главе " База данных и модели" текущего (2.1) Руководства пользователя ZF2 есть фрагмент кода, я не понимаю:
(блок "Использование ServiceManager для настройки шлюза таблицы и внедрения в AlbumTable")
...
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
, право? Метод Zend\ServiceManager\ServiceManager#get(...) ожидает имя класса в качестве первого аргумента. Но нет класса AlbumTableGateway. Существует только два класса моделей: Album\Model\Album и Album\Model\AlbumTable.
Это ошибка в руководстве или я неправильно понимаю код?
Спасибо
1 ответ
Лучший способ думать об этом является то, что ServiceManager get()
Метод принимает значение ключа, а не имя класса. Значение ключа должно быть сопоставлено с чем-то, что приведет к возвращению экземпляра класса.
Если ключ находится в пределах invokables
раздел, то ServiceManager попытается создать экземпляр строки, на которую указывает ключ, в предположении, что это имя класса:
'invokables' => array(
'some_name' => 'My\Mapper\SomeClassName',
),
Если ключ находится в пределах factories
раздел, то ServiceManager выполнит обратный вызов, на который указывает ключ, и ожидает, что экземпляр объекта будет возвращен:
'factories' => array(
'some_name' => function($sm) { return new \My\Mapper\SomeClassName(); },
),
В общем, вы используете фабрику, когда вам нужно сделать нечто большее, чем просто создать экземпляр класса - обычно вам нужно настроить класс с другой зависимостью. Если вам просто нужно создать экземпляр класса, используйте invokable.