搜索

首页  >  问答  >  正文

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. ModelAlbumTableGateway::class这个怎么理解?整个项目中并没有出现AlbumTableGateway这个类,只有AlbumTable这个类

phpcn_u1582phpcn_u15822791 天前664

全部回复(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
  • 取消回复