Comando Laravel – Solo argumento opcional

2 minutos de lectura

avatar de usuario
elbuenchico

tengo un comando con esta firma

order:check {--order}

Y ejecuta esto:

php artisan order:check --order 7

Por alguna razón eso da como resultado esta excepción.

  [RuntimeException]                                 
  Too many arguments, expected arguments "command".  

¿Por qué? Quiero que este comando se pueda ejecutar como php artisan order:check o con una identificación de pedido opcional php artisan order:check --order X

  • Probar --order=X. Puede estar analizando el 7 como un argumento separado en lugar de un valor de opción.

    – Aynber

    10 de octubre de 2017 a las 15:18


  • @aynber todavía necesita agregar el signo igual a la definición del comando como señaló Cy

    – teyo

    10 oct 2017 a las 15:24

  • @Michael lee la sección: Opciones con valores laravel.com/docs/5.5/artisan

    – teyo

    10/10/2017 a las 15:25

avatar de usuario
cy rossignol

los {--order} opción (sin = signo) declara un cambiar opción, que toma sin argumentos. Si la opción de cambio está presente, su valor es igual truey, en su ausencia, false (--help es como un interruptor, no se necesita argumento).

Cuando proporcionamos un argumento en la línea de comando para esta opción, el marco de la consola no puede hacer coincidir la entrada con una opción con un argumento, por lo que arroja el error como se muestra en la pregunta.

Para permitir la opción de aceptar un argumento, cambie el comando $signature a:

protected $signature="order:check {--order=}"

Tenga en cuenta la adición del signo igual después --order. Esto le dice al marco que el --order opción requiere un argumento: el comando generará una excepción si el usuario no proporciona una.

Si queremos que nuestro comando acepte una opción con o sin un argumento, podemos usar una sintaxis similar para proporcionar un valor predeterminado:

protected $signature="order:check {--order=7}"

… pero esto no parece útil para este caso particular.

Después de configurar esto, podemos llamar al comando, pasando un argumento para --order. El marco es compatible con ambos formatos:

$ php artisan order:check --order=7 
$ php artisan order:check --order 7 

… y luego usar el valor de order a nuestro mando:

$orderNumber = $this->option('order');  // 7

  • En este caso, creo que debería usar el siguiente comando php artisan order:check --order=7 para ejecutarlo

    – teyo

    10 oct 2017 a las 15:23

  • @teeyo describe la sintaxis “oficial”, pero el analizador de comandos admite ambos formatos de argumento comunes. --order 7 también funcionará en la mayoría de los casos.

    – Cy Rossignol

    10/10/2017 a las 15:32

  • En realidad, en Laravel 6 si describe una opción como esta {--foo=} y no lo proporciona cuando ejecuta el comando, su valor es null.

    – dajust1

    27 ene a las 15:36

Las respuestas anteriores son correctas, pero aún intentan agregar algunos puntos adicionales. Espero que las cosas a continuación ayuden

Argumentos Obligatorios

protected $signature="order:check {param}";

Argumentos opcionales

protected $signature="order:check {param?}";

Argumentos opcionales con valores predeterminados

protected $signature="order:check {param=foo}";

Referencia: https://laravel.com/docs/5.2/artisan

¿Ha sido útil esta solución?