2011-09-13 13 views
6

I stworzył nową klasę w src/MaintenanceBundle/command, nazwał go GreetCommand.php i umieścić w nim następujący kod:Symfony2 komenda konsoli zwyczaj nie działa

<?php 

namespace SK2\MaintenanceBundle\Command; 

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; 
use Symfony\Component\Console\Input\InputArgument; 
use Symfony\Component\Console\Input\InputInterface; 
use Symfony\Component\Console\Input\InputOption; 
use Symfony\Component\Console\Output\OutputInterface; 

class GreetCommand extends ContainerAwareCommand 
{ 
    protected function configure() 
    { 
     $this 
      ->setName('maintenance:greet') 
      ->setDescription('Greet someone') 
      ->addArgument('name', InputArgument::OPTIONAL, 'Who do you want to greet?') 
      ->addOption('yell', null, InputOption::VALUE_NONE, 'If set, the task will yell in uppercase letters') 
     ; 
    } 

    protected function execute(InputInterface $input, OutputInterface $output) 
    { 
     $name = $input->getArgument('name'); 
     if ($name) { 
      $text = 'Hello '.$name; 
     } else { 
      $text = 'Hello'; 
     } 

     if ($input->getOption('yell')) { 
      $text = strtoupper($text); 
     } 

     $output->writeln($text); 
    } 
} 

?> 

i próbował nazwać poprzez

app/console maintenance:greet Fabien

ale zawsze pojawia się następujący błąd:

[InvalidArgumentException] There are no commands defined in the "maintenance" namespace.

jakieś pomysły?

+1

Czy wyczyściłeś pamięć podręczną po utworzeniu polecenia? –

Odpowiedz

13

zorientowali się, dlaczego to nie działa: po prostu zapomniał zarejestrować Bundle w AppKernel.php. Jednak inne proponowane odpowiedzi są istotne i mogą być pomocne w rozwiązywaniu innych sytuacji!

Zgodnie z konwencją: pliki poleceń muszą znajdować się w katalogu komend pakunku i mieć nazwę kończącą się poleceniem.

w AppKernel.php

public function registerBundles() 
{ 
    $bundles = [ 
     ... 
     new MaintenanceBundle\MaintenanceBundle(), 
    ]; 

    return $bundles; 
} 
0

Chyba trzeba zadzwonić parent::configure() w swojej metodzie configure

41

miałem ten problem, a to dlatego, że nazwa mojej klasy PHP i plik nie kończy się Command.

Symfony automatycznie zarejestruje polecenia, które kończą się Command i są w katalogu Command pakietu. Jeśli chcesz ręcznie zarejestrować swoją komendę, ten wpis Cookbook może pomóc: http://symfony.com/doc/current/cookbook/console/commands_as_services.html

+0

Ten mnie dostał.Przechowujesz polecenia w katalogu poleceń pakietu i nazywasz swoją klasę poleceń komendą na końcu. Następnie Symfony automatycznie zarejestruje wszystko poprawnie. – Halfstop

+1

Właśnie miałem ten problem i to dlatego, że nazwa pliku nie zawierała "Polecenia" na końcu - więc to nie tylko nazwa miejsca lub nazwa katalogu/lokalizacja, która może spowodować ten. –

+0

Dzięki @ScottFlack. Zaktualizowałem swój post, aby było jasne, że nazwa pliku musi również kończyć się "komendą", a nie tylko nazwą klasy. – Sam

5

mam podobny problem i figgured z Innym możliwym rozwiązaniem:

Jeśli zastąpić domyślną metodę __construct polecenia będzie nie być auto zarejestrowane przez symfony, więc musisz albo zastosować podejście do usługi, jak wspomniano wcześniej, albo usunąć nadpisanie __construct i uczynić ten krok init w metodzie execute .. lub w metodzie configure.

Czy ktokolwiek zna dobrą dobrą praktykę, jak wykonać "rzeczy" init w poleceniach symfony?

.. zajęło mi chwilę, aby dowiedzieć się tego ..

+0

Ten mnie dostał. Twoje zdrowie. Powrót do zastrzyku ustawiającego! – Edward

1

Oprócz odpowiedzi MonocroM jest, miałem ten sam problem z moim poleceniem i zostało zignorowane przez Symfony tylko dlatego konstruktor mój rozkaz miał 1 wymaganego argumentu.

Właśnie usunięto go i wywołać metodę rodzic __construct() (Symfony 2.7) i to działało dobrze;)

1

W moim przypadku to był narzekających na przestrzeni nazw „workflow” chociaż WorkflowDumpCommand został prawidłowo dostarczone przez ramy.

Jednak nie można było go uruchomić, ponieważ nie zdefiniowałem żadnych przepływów pracy, więc metoda isEnabled() komendy zwróciła false.

Powiązane problemy