4

这里是 Symfony 新手。在阅读了一些 Symfony 文档和 SO 的一些答案之后,我现在几乎完全糊涂了。我正在尝试使用控制台应用程序组件并创建一个小型 db-aware 控制台应用程序。

许多人说,为了使用 Symfony 的 DI 功能,我的命令类不是从 Symfony\Component\Console\Command\Command 而是从 ContainerAwareCommand 继承就足够了。但是,当我尝试此操作时,我在 application::getKernel() 调用上收到 Method Not Found 错误。

我感觉 DI 功能实际上在基于控制台组件的控制台应用程序中不可用。是否还有另一种基于成熟框架的 Symfony 控制台应用程序?

我非常喜欢控制台组件 Symfony\Component\Console\Application 提供的简单框架。但问题是——依赖注入和 DBAL 该怎么办?我发现的所有示例似乎都引用了完整的 Symfony 框架,让我更加卡住了。

4

4 回答 4

3

如果有人偶然发现同样的问题,请快速更新我的进度。

  1. 我在我的项目中加入了 PHP-DI 依赖注入框架,它似乎在没有配置的情况下运行得相当好(到目前为止)——实际上,它通过反射计算出了很多东西。
  2. 同样,Doctrine\DBAL 作为独立库包含在内(我选择反对它的 O/RM 部分,因为它确实是一个小项目,而且我在 SQL 方面比其他任何东西都更稳固)和连接由连接提供者简单地返回,该连接提供者在 DI 需要的任何地方注入。

我想不通的一件事是如何在没有我帮助的情况下让 DI 库实例化命令类,所以我实际上必须将容器本身注入到我重写的应用程序类中并重写getDefaultCommands()然后将实例拉出的位置手动容器。不理想,但现在必须这样做。

于 2014-09-22T20:51:57.670 回答
1

如果您的命令扩展ContainerAwareCommand

...
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
...

class MyCommand extends ContainerAwareCommand
{

DI 容器可用于该getContainer()方法。(如在标准控制器中),例如:

$this->validator = $this->getContainer()->get('validator');
于 2014-09-21T17:35:19.930 回答
0

您可以使用我刚刚将其推送到 packagist.org 的解决方案。包括完整的工作 symfony/依赖注入。欢迎您试一试。使用 composer 创建您自己的项目composer create-project coral-media/crune project_dir或克隆存储库。 https://packagist.org/packages/coral-media/crune 你只需要安装 DBAL 依赖项(如果你真的不需要,我不建议 ORM)。在中配置连接参数.env,只需定义一个服务来处理连接。可以使用带有注释的公共setMyService($myService)方法将该服务注入您的命令中。@required您也可以创建一个 Connection 类并将绑定作为command构造函数中的参数。crune样板文件还支持自动装配和自动配置功能。

于 2022-02-08T07:07:26.350 回答
0

我不知道你的问题是否仍然相关,但我有一个答案,因为我在这里偶然发现了同样的问题。

您只需要自己创建内核并将其提供给扩展基本\Symfony\Component\Console\Application 的\Symfony\Bundle\FrameworkBundle\Console\Application。

<?php
// CronRun.php

require __DIR__.'/../../../../vendor/autoload.php';
require_once __DIR__.'/../../../../app/AppKernel.php';

$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();

$application = new \Symfony\Bundle\FrameworkBundle\Console\Application($kernel);
$application->add(new \KingdomHall\TaskBundle\Command\CronCommand());
$input = new \Symfony\Component\Console\Input\StringInput('k:c:r');
$application->run($input);
于 2015-09-01T09:37:10.453 回答