如何从 servicemanager 中获取 dbadapter

How to get dbadapter out of the servicemanager

我尝试使用以下语句获取数据库适配器:

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

我收到一个错误 "A plugin by the name "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 中获取这些密钥,并在这种情况下在那里创建自己的工厂吗?我知道这是一个非常基本的问题,但我认为如果我不做对,它总会再次超越我。

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

修复您的代码:

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

可以在 migration docs 中找到更详细的信息。