Symfony:使用console.com命令标记命令似乎不起作用

时间:2013-05-23 10:02:08

标签: symfony dependency-injection

默认情况下,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不再受支持了吗?如果答案是肯定的,那么您建议在命令类中使用什么来处理依赖项?

谢谢!

3 个答案:

答案 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,则会自动执行此操作。