2013-03-21 30 views
1

在Zend框架2用戶的相冊示例性引導的模型被配置是這樣的:Zend Framework 2用戶指南中初始化的ServiceManager對象在哪裏?

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

可變$smZend\ServiceManager\ServiceManager對象。但是,如何/何時/何地創建/初始化?

編輯:

我想知道的是:如何/在哪裏呢$sm得到它的值(和成爲的ServiceManager對象)。

+0

我會等待來自ZF2,離散事件之一的答案,但我的假設是這條線:https://github.com/zendframework/zf2/blob/master/library/Zend/ServiceManager/ServiceManager。 PHP#L737 – Sam 2013-03-21 11:43:37

+0

如果您正在使用的應用程序框架,它是由'應用程序初始化::實例化()'這裏 - > https://github.com/zendframework/zf2/blob/master/library/Zend/Mvc/Application .php#L236 – Crisp 2013-03-21 12:29:31

+0

謝謝你的回覆!我還沒有得到,它如何工作。我只是試圖制定我的問題exacter,s。編輯。 – automatix 2013-03-21 12:56:04

回答

1

當您從服務管理器中檢索服務時,如果它是一個工廠,它將它自己的一個實例作爲第一個參數傳遞給負責創建該服務的可調用對象,這通常是閉包(就像在你的例如)或工廠類的createService方法。

這樣做,在工廠的情況下,這裏的代碼https://github.com/zendframework/zf2/blob/master/library/Zend/ServiceManager/ServiceManager.php#L859

基本上,你的模塊中你告訴的ServiceManager,這些服務是通過調用您提供的封閉創建。當你問的ServiceManager他們的get()一個第一次,它會確定這是一個工廠(這是在配置工廠鍵提供),然後弄清楚,如果它是一個封閉或FactoryInterface(工廠類)的實例,最後調用它來實例化你的服務。

+0

感謝您的意見和答案!我想,我卡住了......我試着調試應用程序,特別是'ServiceManager#createFromFactory()',但找不到點,$ sm'獲取它的值。 ZF2很難調試,因此很難學習/不支持(無論如何)。如果沒有太多的努力,你可以(或別人)一步一步地描述整個鏈到代碼中的位置,其中'$ sm'被初始化並獲得值。就像一個評論堆棧跟蹤。這將非常棒。非常感謝您提前! – automatix 2013-03-21 15:33:35

+3

是@Sam在你的OP連接線是在$ SM獲取其值,該行'$實例= call_user_func($調用,這$,$ CNAME,$ RNAME);'其中第二PARAM'$ this'是傳遞給'call_user_func'的'ServiceManager'實例成爲您收到的作爲第一個參數的'$ sm'實例 – Crisp 2013-03-21 15:46:11