2016-08-02 53 views
1

我在symfony3上有很大的项目。在这个项目中我有ProjectFrameworkBundle。在“xxx”命名空间中没有定义命令

项目/ FrameworkBundle /控制台/ Command.php

abstract class Command extends ContainerAwareCommand 
{ 
    //... 

    protected function execute(InputInterface $input, OutputInterface $output) 
    { 
     // do some regular staff 
     $exitCode = $this->executeCommand($input, $output); 
     // do some regular staff 
    } 

    abstract protected function executeCommand(InputInterface $input, OutputInterface $output); 

    //... 
} 

如果我会做任何命令,从命令类扩展,它工作正常(测试)。

不过,我还有一个包

项目/ FrameworkQueue /控制台/ Command.php

use Project\FrameworkBundle\Console\Command as BaseCommand; 
abstract class Command extends BaseCommand 
{ 
    // ... 
    protected function executeCommand(InputInterface $input, OutputInterface $output) 
    { 
     // do some regular staff 
     $exitCode = $this->executeJob($input, $output); 
     // do some regular staff 
    } 

    abstract protected function executeJob(InputInterface $input, OutputInterface $output); 

    // ... 
} 

所以,当我改变艾米命令从extends Project\FrameworkBundle\Console\Commandextends Project\QueueBundle\Console\Command从命令列​​表中隐藏。我试图从executeCommand中删除QueueBundle中的所有员工,但它对我没有帮助。但是,如果我在这个命令中对php代码犯了错误,我会看到异常。

有什么不对?我的错误在哪里,或者这是一个错误。我在哪里可以找到收集和检查可用命令的symfony代码?

谢谢!

P.S.问题不在于文件或类命名 - 我多次检查它。当然,当我改变父类时,我改变了函数名。

回答

1

问题是重写__construct方法在QueueBundle\Console\Command 。如果你会尝试这样做:

public function __construct($name) 
{ 
    parent::__construct($name); 
} 

......它不会工作。我不知道为什么,但是我将一些逻辑从这里移到了“执行前”操作。

谢谢大家!

1

如果命令扩展ContainerAwareCommand,Symfony甚至会注入容器。但是,如果没有 - 您必须将您的命令注册为服务。

#应用程序/配置/ config.yml 服务:

app.command.your_command: 
     class: Project\FrameworkBundle\Command\Console\YourCommand 
     tags: 
      - { name: console.command } 

在编译内核的Symfony按标签console.command找到你的命令,并注入到应用程序命令列表

查看详细信息关于这个话题,你可以检查官方文档 - https://symfony.com/doc/current/console/commands_as_services.html

+0

谢谢你花时间回答我的问题,但我刚刚找到原因。我会写在下面。 –

+1

啊,好的。欢迎! – Rinat

相关问题