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.

Другие вопросы по тегам