Где находится объект ServiceManager, инициализированный в руководстве пользователя Zend Framework 2?

В примере альбома руководства пользователя Zend Framework 2 модель настроена следующим образом:

<?php
namespace Album;

// Add these import statements:
use Album\Model\Album;
use Album\Model\AlbumTable;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;

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 объект. Но как / когда / где он создается / инициализируется?

РЕДАКТИРОВАТЬ:

Что я хочу знать, это: Как / где $sm получить его значение (и стать объектом ServiceManager).

1 ответ

Когда вы извлекаете службу из диспетчера служб, если это фабрика, она передает свой экземпляр в качестве первого параметра тому, кто вызвал вызывающий элемент, ответственный за создание службы, который обычно будет либо закрытием (как в вашем примере), либо метод createService фабричного класса.

В случае фабрик это делается с помощью кода здесь https://github.com/zendframework/zf2/blob/master/library/Zend/ServiceManager/ServiceManager.php

По сути, в вашем модуле вы сообщаете ServiceManager, что эти службы создаются путем вызова предоставленных вами замыканий. Когда вы просите ServiceManager get() один из них в первый раз, он определит, что это фабрика (она была указана в ключе фабрики в config), затем выяснит, является ли это закрытием или экземпляром FactoryInterface (класс фабрики), и, наконец, вызовет его соответствующим образом для создать экземпляр вашего сервиса.

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