Zend framework2 在Zend Framework 2用户指南中,ServiceManager对象在哪里初始化?

Zend framework2 在Zend Framework 2用户指南中,ServiceManager对象在哪里初始化?,zend-framework2,zend-framework-modules,servicemanager,Zend Framework2,Zend Framework Modules,Servicemanager,在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 { // getAutol

在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);
                },
            ),
        );
    }
}

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

对于工厂来说,这是通过这里的代码实现的


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

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

对于工厂来说,这是通过这里的代码实现的


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

我会等待ZF2开发人员的回答,但我的假设是这样的:如果您使用的是框架应用程序,它将由
Application::init()实例化。
这里->感谢您的回复!我还是不明白,它是如何工作的。我刚刚试着把我的问题精确地表述出来,s。EDIT.@automatix,当您从服务管理器检索服务时,如果它是工厂,它会将自身的实例作为第一个参数传递给负责创建服务的
可调用的
,这通常是
关闭
(如您的示例所示),或者工厂类的
createService
方法。对于工厂来说,这是通过这里的代码来完成的->@Crisp我同意你的意见,将此作为一个答案发布,这样它就可以帮助其他人解决类似的问题。我会等待ZF2开发人员的回答,但我的假设是这样的:如果你使用的是框架应用程序,它将由
Application::init()实例化
这里->感谢各位的回复!我还是不明白,它是如何工作的。我刚刚试着把我的问题精确地表述出来,s。EDIT.@automatix,当您从服务管理器检索服务时,如果它是工厂,它会将自身的实例作为第一个参数传递给负责创建服务的
可调用的
,这通常是
关闭
(如您的示例所示),或者工厂类的
createService
方法。对于工厂来说,这是通过这里的代码完成的->@Crisp我同意你的意见,将此作为答案发布,这样它可以帮助其他人解决类似问题谢谢你的评论和答案!我想,我被卡住了。。。我试图调试应用程序,特别是
ServiceManager#createFromFactory()
,但找不到
$sm
获取其值的点。ZF2很难调试,因此很难学习/理解(对我来说)。如果不太费力,请您(或其他人)逐步描述整个链到代码中的位置,其中
$sm
被初始化并获取值。类似于注释堆栈跟踪。那太好了。提前非常感谢!@Sam在OP中链接的那一行是$sm获取其值的地方,这一行
$instance=call\u user\u func($callable,$this,$cName,$rName)
其中第二个参数
$this
是传递给
call\u user\u func
ServiceManager
实例,它将成为作为closure的第一个参数接收的
$sm
实例谢谢您的评论和回答!我想,我被卡住了。。。我试图调试应用程序,特别是
ServiceManager#createFromFactory()
,但找不到
$sm
获取其值的点。ZF2很难调试,因此很难学习/理解(对我来说)。如果不太费力,请您(或其他人)逐步描述整个链到代码中的位置,其中
$sm
被初始化并获取值。类似于注释堆栈跟踪。那太好了。提前非常感谢!@Sam在OP中链接的那一行是$sm获取其值的地方,这一行
$instance=call\u user\u func($callable,$this,$cName,$rName)
其中第二个参数
$this
是传递给
call\u user\u func
ServiceManager
实例,它将成为作为闭包的第一个参数接收的
$sm
实例