搜尋

首頁  >  問答  >  主體

zend-framework - zend framework2和3中getServiceConfig函數的設定問題

//Module.php中的一段代码(项目是zend framework2官网上的简单例子)
 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);
                },
            ),
        );
    }
//zend framework3中的样子
 public function getServiceConfig()
    {
        return [
            'factories' => [
                Model\AlbumTable::class => function($container) {
                    $tableGateway = $container->get(Model\AlbumTableGateway::class);
                    return new Model\AlbumTable($tableGateway);
                },
                Model\AlbumTableGateway::class => function ($container) {
                    $dbAdapter = $container->get(AdapterInterface::class);
                    $resultSetPrototype = new ResultSet();
                    $resultSetPrototype->setArrayObjectPrototype(new Model\Album());
                    return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
                },
            ],
        ];
    }
  1. $sm是什麼型別?

  2. Model\AlbumTableGateway::class這個怎麼理解?整個專案中並沒有出現AlbumTableGateway這個類,只有AlbumTable這個類別

#
phpcn_u1582phpcn_u15822791 天前662

全部回覆(1)我來回復

  • PHP中文网

    PHP中文网2017-05-16 16:45:14

    自己找到了一個相似的問題,翻譯在下面,翻譯在更下面。

    來源:Zend Framework 2 中的AlbumTableGateway 使用者指南

    最好的思考方式是 ServiceManager 的 get() 方法採用鍵值,而不是類別名稱。鍵值需要映射到將導致返回類別實例的內容。

    如果鍵位於 invokables 部分,那麼 ServiceManager 將嘗試實例化鍵指向的字串(假設它是類別名稱):

    雷雷

    如果 key 在工廠部分,那麼 ServiceManager 將執行該 key 指向的回呼並期望傳回一個物件實例:

    雷雷

    一般來說,當您需要做的事情不僅僅是實例化一個類別時,您可以使用工廠 - 通常您需要使用另一個依賴項來設定該類別。如果您只需要實例化一個類,請使用可呼叫的。


    翻譯:
    最好這樣想:ServiceManagerget()方法接受一個而不是一個類別名稱,這個會去符合invokablesfactories中的元素並傳回一個已建立的物件。 ServiceManagerget()方法接受一个而不是一个类名,这个会去匹配invokablesfactories中的元素并返回一个创建的对象。
    如果这个是处于invocables如果這個 是一個invocables 的區域,就會它實例化匹配到的那個類別。

    雷雷

    如果這個处于工厂里,就会通过指向的callback函數實例化一個物件回傳。

    雷雷

    (如果沒有匹配到就報錯了)
    一般來說,只有當你不僅僅是實例化一個存在的類,而是要去構建一個有其他依賴的類的時候才會使用factories,否则的话就用invokables就好了

    回覆
    0
  • 取消回覆