2013-02-22 3 views
2

В главе «Database and models» тока (2,1) ZF2 Руководство пользователя там фрагмент кода, я не понимаю:AlbumTableGateway в Zend Framework Руководство пользователя 2

(блок «Использование 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. Есть только два класса моделей: Альбом \ Модель \ Альбом и Альбом \ Модель \ АльбомТаблица.

Это ошибка руководства или я неправильно понимаю код?

Благодаря

+1

О, я вижу сейчас ... Нет класса 'AlbumTableGateway', так как вызовы' AlbumTableGateway' завершаются в AlbumTableGateway-Factory, что накладывает соответствующие объекты на лету. ОК, разрешено. :) – automatix

+0

Точно, '$ sm-> get ('alias')' требует экземпляр класса, который будет возвращен из SM указанным псевдонимом. – Sam

ответ

3

Лучший способ думать о том, что метод ServiceManager в get() занимает ключевое значение, а не имя класса. Ключевое значение необходимо сопоставить с тем, что приведет к возврату экземпляра класса.

Если ключ находится в разделе invokables, то ServiceManager попытается создать экземпляр строки, ключевые моменты, на том предположении, что это имя_класса:

'invokables' => array(
    'some_name' => 'My\Mapper\SomeClassName', 
), 

Если ключ находится в разделе factories , то ServiceManager будет выполнять функцию обратного вызова, что ключевые моменты в и планирующим экземпляр объекта будет возвращено:

'factories' => array(
    'some_name' => function($sm) { return new \My\Mapper\SomeClassName(); }, 
), 

в общем, вы используете завод, когда вам нужно сделать что-то большее, чем просто instantia te class - обычно вам нужно настроить класс с другой зависимостью. Если вам просто нужно создать экземпляр класса, используйте invokable.