zend-framework - zend framework2和3中getServiceConfig函數的設定問題
phpcn_u1582
phpcn_u1582 2017-05-16 16:43:14
0
1
681
//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_u1582
phpcn_u1582

全部回覆(1)
洪涛

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

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

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

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

雷雷

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

雷雷

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


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

雷雷

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

雷雷

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板