2016-08-02 2 views
1

У меня был большой проект на symfony3. В этом проекте у меня есть ProjectFrameworkBundle.Нет команд, определенных в пространстве имен «xxx»

Project/FrameworkBundle/Console/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); 

    //... 
} 

Если я сделаю любую команду, простиралась от класса Command, он будет работать нормально (проверено).

Но, у меня есть еще один Bundle

Project/FrameworkQueue/Console/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\Command в extends 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/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

Смежные вопросы