如何从服务管理器

时间:2017-06-14 11:45:13

标签: php zend-framework zend-db zend-framework3

我尝试使用以下语句获取databaseadapter:

$dbAdapter =  $this->getServiceLocator()->get('db');

我收到错误 "一个名为" getServiceLocator"的插件在插件管理器Zend \ Mvc \ Controller \ PluginManager"

中找不到

在我的module.php中搜索时(这是一个正确的文件吗?)我认为这可能是一个理解问题。我阅读了Ralph Eggert的文章和zend文档。我明白我可以通过servicemanager获取任何配置信息。但我发现的所有文件都是Zend2。

所以在我的module.php中,我看到类似这样的内容(片段):

public function getServiceConfig()
{
    return [
            'factories' => [
                    Model\ImportTable::class => function($container) {
                        $tableGateway = $container->get(Model\ImportTableGateway::class);
                        return new Model\ImportTable($tableGateway);
                    },
                    Model\ImportTableGateway::class => function ($container) {
                        $dbAdapter = $container->get(AdapterInterface::class);
                        $resultSetPrototype = new ResultSet();
                        $resultSetPrototype->setArrayObjectPrototype(new Model\Import());
                        return new TableGateway('t_dcl', $dbAdapter, null, $resultSetPrototype);
                    },
                    Model\DclimportTable::class => function($container) {
                        $tableGateway = $container->get(Model\DclimportTableGateway::class);
                        return new Model\DclimportTable($tableGateway);
                    },
                    Model\DclimportTableGateway::class => function ($container) {
                        $dbAdapter = $container->get(AdapterInterface::class);
                        $resultSetPrototype = new ResultSet();
                        $resultSetPrototype->setArrayObjectPrototype(new Model\Dclimport());
                        return new TableGateway('t_dcl_import', $dbAdapter, null, $resultSetPrototype);
                    },

在那里我看到一个变量$ dbAdapter,但我怎样才能得到这个变量?上面的错误可能是因为我现在使用ZEND3?这种方法是否已被弃用?我无法找到任何迁移信息。

无论如何,有人可以向我解释一下,如何从module.php中获取这些密钥,并在这种情况下在那里创建自己的工厂?我知道这是一个非常基本的问题,但我认为如果我没有做到这一点,它将永远超过我。

1 个答案:

答案 0 :(得分:1)

控制器内的服务定位器在2.7版中已弃用,在3.0版中已删除。

修复您的代码:

  • 查找调用getServiceLocator()的所有情况,并标识它们检索的服务。
  • 更新您的控制器以通过构造函数接受这些服务。
  • 如果您还没有,请为您的控制器创建一个工厂类。
  • 在工厂中,提取适当的服务并将它们传递给控制器​​的构造函数。

更详细的信息可以在migration docs

中找到