zend-framework - zend framework2和3中getServiceConfig函数的配置问题
phpcn_u1582
phpcn_u1582 2017-05-16 16:43:14
0
1
657
//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. ModelAlbumTableGateway::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就好了

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板