默认情况下,Symfony会尝试扫描每个bundle目录中一个名为“Command”的文件夹,并在其中搜索Console \ Command类。
但是当您想在控制台命令中使用DIC和DI时,还有另一种方法可以实现这一点。根据{{3}},应该可以使用依赖注入容器加载控制台命令,所以我尝试了。
我制作了一个service.xml:
<services>
<service id="atlas_cli.helper.anonymize" class="AtlasCliBundle\Services\AnonymizerHelperService" public="false" />
<service id="atlas_cli.helper.dbconfiguration" class="AtlasCliBundle\Services\ConfigurationHelperService" public="false" />
<service id="atlas_cli.helper.schemadump" class="AtlasCliBundle\Services\SchemaDumpHelperService" public="false" />
<service id="atlas_cli.helperset" class="Symfony\Component\Console\Helper\HelperSet" />
<service id="atlas_cli.command.anonymize" class="AtlasCliBundle\Command\AnonymizeCommand" public="true">
<tag name="console.command" />
<call method="setHelperSet">
<argument type="service" id="atlas_cli.helperset" />
</call>
<call method="setAnonymizeHelper">
<argument type="service" id="atlas_cli.helper.anonymize" />
<argument type="string">dbanonymizer</argument>
</call>
<call method="setDbConfigurationHelper">
<argument type="service" id="atlas_cli.helper.dbconfiguration" />
<argument type="string">dbconfiguration</argument>
</call>
</service>
<service id="atlas_cli.command.schema" class="AtlasCliBundle\Command\SchemaCommand" public="true">
<tag name="console.command" />
<call method="setHelperSet">
<argument type="service" id="atlas_cli.helperset" />
</call>
<call method="setDbConfigurationHelper">
<argument type="service" id="atlas_cli.helper.dbconfiguration" />
<argument type="string">dbconfiguration</argument>
</call>
<call method="setSchemadumpHelper">
<argument type="service" id="atlas_cli.helper.schemadump" />
<argument type="string">schemadump</argument>
</call>
</service>
</services>
正如您所看到的,我已经配置了两个命令anonymize和schema。运行app / console时可以使用这些命令,但从不调用set方法(例如setDbConfigurationHelper)。
我使用Symfony 2.1,但是我在grep -ris "console\.command" *
上搜索了完整的Symfony框架代码,但是对于Symfony 2.3来说,这并没有给出任何有用的结果。
标签console.com不再受支持了吗?如果答案是肯定的,那么您建议在命令类中使用什么来处理依赖项?
谢谢!
答案 0 :(得分:3)
Symfony 2.4
中引入了console.command
标记
对于 Symfony 2.3 ,较低版本会将Bundle::registerCommands
覆盖为以下内容:
<?php
namespace Acme\DemoBundle;
use Symfony\Component\Console\Application;
// ...
class AcmeDemoBundle extends Bundle
{
public function registerCommands(Application $application)
{
$container = $application->getKernel()->getContainer();
$application->add($container->get('atlas_cli.command.anonymize'));
$application->add($container->get('atlas_cli.command.schema'));
}
}
答案 1 :(得分:1)
让您的服务可用的最快解决方案就是在您的Command中扩展Symfony/Bundle/FrameworkBundle/Command/ContainerAwareCommand。
use Symfony/Bundle/FrameworkBundle/Command/ContainerAwareCommand;
class AnonymizeCommand extends ContainerAwareCommand
{
// ...
然后您可以像往常一样访问容器,并可以使用
引入依赖项$myService = $this->container->get('service-name');
是的,我知道出于性能原因和其他各种原因,通常不建议注入整个容器......
在容器中调试标记(自2.2起可用)
app/console container:debug --tags
使用
调试单个标记app/console container:debug --tag=doctrine.event_listener
使用grep搜索与命令相关的标记(如果你在Windows上,则搜索findstr)
app/console container:debug --tags | grep command
如果您使用的是symfony2,则无法使用这些命令进行调试。在这种情况下,您应该尝试以下2个捆绑包。两者都在Profiler中提供有关容器的信息。
答案 2 :(得分:0)
搜索console.command并添加它们的组件是AddConsoleCommandPass:
public function build(ContainerBuilder $container) {
parent::build($container); // TODO: Change the autogenerated stub
$container->addCompilerPass(new AddConsoleCommandPass());
}
如果在内核中添加FrameworkBundle,则会自动执行此操作。