【问题标题】:Symfony/Doctrine: get list of available commandsSymfony/Doctrine:获取可用命令列表
【发布时间】:2020-10-21 07:19:26
【问题描述】:

我有一个 Symfony 项目,我正在尝试获取控制器中可用命令的列表,因此我尝试执行 list-command(连同 --format=xml)来实现这一目标。

我使用here 列出的代码从控制器运行命令,但最终出现错误“不推荐使用连接提供程序作为第一个构造函数参数”

这是代码:

    $application = new Application($kernel);
    $application->setAutoExit(false);
    $input  = new ArrayInput(['command' => 'list', '--format' => 'xml']);
    $output = new BufferedOutput();
    $application->run($input, $output);
    $content = $output->fetch();

上述错误发生在vendor\doctrine\dbal\lib\Doctrine\DBAL\Tools\Console\Command\RunSqlCommand.php。这是完整的跟踪:

[
  "exception" => ErrorException {
    #message: "User Deprecated: Not passing a connection provider as the first constructor argument is deprecated"
    #code: 0
    #file: "C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\doctrine\dbal\lib\Doctrine\DBAL\Tools\Console\Command\RunSqlCommand.php"
    #line: 44
    #severity: E_USER_DEPRECATED
    trace: {
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\doctrine\dbal\lib\Doctrine\DBAL\Tools\Console\Command\RunSqlCommand.php:44 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\var\cache\dev\Container54qfFMq\getDoctrine_QuerySqlCommandService.php:24 {
        Container54qfFMq\getDoctrine_QuerySqlCommandService::do($container, $lazyLoad = true)
        › 
        › $container->privates['doctrine.query_sql_command'] = $instance = new \Doctrine\Bundle\DoctrineBundle\Command\Proxy\RunSqlDoctrineCommand();
        › 
      }
      C:\xampp\htdocs_shopfloor\shopfloorlist\var\cache\dev\Container54qfFMq\App_KernelDevDebugContainer.php:609 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\dependency-injection\Container.php:441 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\dependency-injection\Argument\ServiceLocator.php:40 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\console\CommandLoader\ContainerCommandLoader.php:45 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\console\Application.php:527 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\console\Application.php:723 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\framework-bundle\Console\Application.php:142 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\console\Descriptor\ApplicationDescription.php:91 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\console\Descriptor\ApplicationDescription.php:68 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\console\Descriptor\XmlDescriptor.php:97 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\console\Descriptor\XmlDescriptor.php:155 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\console\Descriptor\Descriptor.php:55 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\console\Helper\DescriptorHelper.php:65 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\console\Command\ListCommand.php:75 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\console\Command\Command.php:258 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\console\Application.php:938 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\framework-bundle\Console\Application.php:99 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\console\Application.php:266 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\framework-bundle\Console\Application.php:82 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\console\Application.php:142 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\src\Controller\AdminController.php:134 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\http-kernel\HttpKernel.php:157 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\http-kernel\HttpKernel.php:79 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\vendor\symfony\http-kernel\Kernel.php:196 { …}
      C:\xampp\htdocs_shopfloor\shopfloorlist\public\index.php:29 { …}
    }
  }
]

奇怪的是,运行“bin/console list”(或只是“bin/console”)无论是否设置为 XML 格式都不会显示错误,使用上述代码从我的控制器运行任何其他命令也可以正常工作很好。

我正在使用 Symfony 5.1.7 和 Doctrine-bundle 2.1,我已经尝试将教义/持久性降级到 1.x,因为 2.x 显示一些库存在一些问题,但都无济于事。

【问题讨论】:

  • 出于好奇:为什么需要控制器中的命令?另外,为什么不忽略该消息?这是一个弃用警告,而不是运行时错误,并且可能在控制台上生成列表会在使用相同的错误级别时产生相同的错误
  • 我想在网页上查看可用命令的列表,管理员可以单击以手动执行它们。因为我需要在自动添加命令时扩展列表,所以我正在尝试这样做。当然,我可以“忽略”错误,这意味着将其过滤掉(因为它是 $content 的一部分),但我宁愿了解错误发生的原因/位置并修复它。还有一些外部库也出现了同样的错误,我无法在那里过滤它。

标签: php symfony doctrine


【解决方案1】:

我通过在我的项目中使用正确的参数重新声明命令来解决此问题:

doctrine.query_sql_command:
    class: Doctrine\DBAL\Tools\Console\Command\RunSqlCommand
    arguments:
        - '@Doctrine\Bundle\DoctrineBundle\Dbal\ManagerRegistryAwareConnectionProvider'
    tags:
        - { name: console.command, command: doctrine:query:sql }

【讨论】:

  • @yivi 不知道为什么,但它确实解决了问题,到目前为止还没有遇到任何缺点,谢谢文森特
猜你喜欢
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多