1

在 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 对象)。

4

1 回答 1

1

当您从服务管理器检索服务时,如果它是工厂,它会将自身的实例作为第一个参数传递给负责创建服务的任何可调用对象,这通常是闭包(如您的示例中所示),或者工厂类的 createService 方法。

对于工厂,这是通过此处的代码https://github.com/zendframework/zf2/blob/master/library/Zend/ServiceManager/ServiceManager.php#L859完成的

基本上,在您的模块中,您告诉 ServiceManager 这些服务是通过调用您提供的闭包来创建的。当您第一次向 ServiceManager 询问get()其中一个时,它会确定它是一个工厂(它是在 config 中的 factory 键中提供的),然后确定它是闭包还是 FactoryInterface 的实例(工厂类),最后适当地调用它来实例化您的服务。

于 2013-03-21T14:50:34.850 回答