2011-09-13 14 views
6

que creó una nueva clase en src/MaintenanceBundle/comando, lo nombró GreetCommand.php y poner el siguiente código en él:Symfony2 comando de consola personalizada que no trabaja

<?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); 
    } 
} 

?> 

y trató de llamarlo a través

app/console maintenance:greet Fabien

pero siempre me sale el siguiente error:

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

¿Alguna idea?

+1

¿Borró la memoria caché después de crear el comando? –

Respuesta

13

me di cuenta de por qué no estaba funcionando: simplemente se olvidó de registrar el paquete en el AppKernel.php. Sin embargo, las otras respuestas propuestas son relevantes y podrían ser útiles para resolver otras situaciones.

Por convención: los archivos de comandos deben residir en el directorio de comandos de un paquete y tener un nombre que termine en Comando.

en AppKernel.php

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

    return $bundles; 
} 
0

yo creo que hay que llamar parent::configure() en su método configure

41

he tenido este problema, y ​​fue debido a que el nombre de mi clase PHP y el archivo no terminó con Command.

Symfony registrará automáticamente los comandos que terminan en Command y están en el directorio Command de un paquete. Si desea manualmente registrar su comando, pero esta entrada libro de cocina puede ayudar: http://symfony.com/doc/current/cookbook/console/commands_as_services.html

+0

Este me tiene.Tienes que almacenar tus comandos en el directorio de comandos de un paquete y nombrar tu clase de comando con Comando al final. Entonces Symfony registrará automáticamente todo. – Halfstop

+1

Acabo de tener este problema y fue porque el nombre del archivo no tenía 'Comando' al final del mismo, así que no es solo el nombre del espacio o el nombre/ubicación del directorio que puede causar este. –

+0

Gracias @ScottFlack. He actualizado mi publicación para que quede más claro que el nombre del archivo también debe terminar con 'command', no solo el nombre de la clase. – Sam

5

tengo un problema similar y figgured a cabo otra posible solución:

Si reemplaza el método __construct defecto, el comando no ser auto registrado por Symfony, por lo que debe tomar el enfoque de servicio como se mencionó anteriormente o eliminar la anulación __construct y realizar ese paso de inicialización en el método de ejecución ... o en el método de configuración.

¿Alguien sabe realmente cuál es la mejor práctica de cómo hacer init "cosas" en los comandos de Symfony?

.. Me tomó un momento para resolver esto ..

+0

Este me tiene. Aclamaciones. ¡De vuelta a la inyección setter! – Edward

1

Además de la respuesta de MONOCROM, que tenía el mismo problema con mi mando y fue ignorada en silencio por Symfony sólo porque el constructor de mi mando tenía 1 argumento necesario.

me acaba de quitar y llamar al método parent __construct() (Symfony 2.7) y funcionó bien;)

1

En mi caso, se quejaba por el espacio de nombres "flujo de trabajo", aunque el WorkflowDumpCommand se proporcionó correctamente por el marco.

Sin embargo, no estaba disponible para ejecutar porque no he definido ningún flujo de trabajo, por lo que el método isEnabled() del comando devolvió false.