Crear comandos Spark

Si bien la capacidad de utilizar controladores a través de CLI como cualquier otra ruta es conveniente, es posible que encuentres ocasiones en las que Necesito algo diferente. Ahí es donde entran los comandos de Spark. Son clases simples que no Es necesario tener rutas definidas, lo que las hace perfectas para crear herramientas que los desarrolladores puedan usar para crear simplificar sus trabajos, ya sea manejando migraciones o inicialización de bases de datos, verificando el estado de cronjobs o incluso Creación de generadores de códigos personalizados para su empresa.

Crear nuevos comandos

Puede crear muy fácilmente nuevos comandos para utilizarlos en su propio desarrollo. Cada clase debe estar en su propio archivo, y debe extender Higgs\CLI\BaseCommand e implementar el método run().

Se deben utilizar las siguientes propiedades para aparecer en los comandos CLI y agregar funcionalidad de ayuda a su comando:

  • $group: una cadena para describir el grupo en el que se agrupa el comando al enumerar comandos. Por ejemplo: Base de datos

  • $name: una cadena para describir el nombre del comando. Por ejemplo: hacer:controlador

  • $descripción: una cadena para describir el comando. Por ejemplo: Genera un nuevo archivo de controlador.

  • $usage: una cadena para describir el uso del comando. Por ejemplo: hacer:controlador<name> [opciones]

  • $argumentos: una matriz de cadenas para describir cada argumento del comando. Por ejemplo: 'nombre' => 'El nombre de la clase del controlador.'

  • $opciones: una matriz de cadenas para describir cada opción de comando. Por ejemplo: '--force' => 'Forzar sobrescritura de archivo existente.'

La descripción de ayuda se generará automáticamente según los parámetros anteriores.

Ubicación del archivo

Los comandos deben almacenarse dentro de un directorio llamado Comandos. Sin embargo, ese directorio debe estar ubicado en los espacios de nombres PSR-4. para que el Autocargador puede localizarlo. Esto podría estar en aplicación/Comandos, o un directorio en el que guarda los comandos para utilizarlos en todo el desarrollo de su proyecto, como Acme/Commands.

Nota

When the commands are executed, the full Higgs CLI environment has been loaded, making it Es posible obtener información del entorno, información de ruta y utilizar cualquiera de las herramientas que utilizaría al crear un controlador.

Un comando de ejemplo

Veamos un comando de ejemplo cuya única función es informar información básica sobre la aplicación. en sí, con fines de demostración. Comience creando un nuevo archivo en app/Commands/AppInfo.php. Él debe contener el siguiente código:

<?php

namespace App\Commands;

use Higgs\CLI\BaseCommand;
use Higgs\CLI\CLI;

class AppInfo extends BaseCommand
{
    protected $group       = 'Demo';
    protected $name        = 'app:info';
    protected $description = 'Displays basic application information.';

    public function run(array $params)
    {
        // ...
    }
}

Si ejecuta el comando list, verá el nuevo comando listado en su propio grupo Demo. Si lo tomas Si lo miras de cerca, deberías ver cómo esto funciona con bastante facilidad. La propiedad $group simplemente le dice cómo organizar este comando con todos los demás comandos que existen, indicándole en qué título incluirlo.

La propiedad $name es el nombre con el que se puede llamar a este comando. El único requisito es que no contenga un espacio y todos los caracteres deben ser válidos en la propia línea de comando. Sin embargo, por convención, los comandos están en minúsculas, y la agrupación adicional de comandos se realiza mediante el uso de dos puntos con el nombre del comando en sí. Esto ayuda a mantener múltiples comandos tengan colisiones de nombres.

La propiedad final, $description es una cadena corta que se muestra en el comando list y debe describir lo que hace el comando.

correr()

El método run() es el método que se llama cuando se ejecuta el comando. La matriz $params es una lista de cualquier argumento de CLI después del nombre del comando para su uso. Si la cadena CLI fuera:

php chispa foo bar baz

Entonces foo es el nombre del comando, y la matriz $params sería:

<?php

$params = ['bar', 'baz'];

También se puede acceder a esto a través de :doc:`CLI </cli/cli_library>`biblioteca, pero ya se ha eliminado su comando de la cuerda. Estos parámetros se pueden utilizar para personalizar el comportamiento de sus scripts.

Nuestro comando de demostración podría tener un método run() similar a:

<?php

namespace App\Commands;

use Higgs\CLI\BaseCommand;
use Higgs\CLI\CLI;

class AppInfo extends BaseCommand
{
    // ...

    public function run(array $params)
    {
        CLI::write('PHP Version: ' . CLI::color(PHP_VERSION, 'yellow'));
        CLI::write('CI Version: ' . CLI::color(\Higgs\Higgs::HIGGS_VERSION, 'yellow'));
        CLI::write('APPPATH: ' . CLI::color(APPPATH, 'yellow'));
        CLI::write('SYSTEMPATH: ' . CLI::color(SYSTEMPATH, 'yellow'));
        CLI::write('ROOTPATH: ' . CLI::color(ROOTPATH, 'yellow'));
        CLI::write('Included files: ' . CLI::color(count(get_included_files()), 'yellow'));
    }
}

Consulte la Biblioteca CLI página para obtener información detallada.

Terminación del comando

De forma predeterminada, el comando sale con un código de éxito de 0. Si se encuentra un error al ejecutar un comando, puedes terminar el comando usando la construcción del lenguaje return con un código de salida en el método run().

Por ejemplo, devuelve EXIT_ERROR;

Este enfoque puede ayudar con la depuración a nivel del sistema, si el comando, por ejemplo, se ejecuta mediante crontab.

Puede utilizar las constantes del código de salida EXIT_* definidas en el archivo app/Config/Constants.php.

Comando base

La clase BaseCommand que todos los comandos deben extender tiene un par de métodos de utilidad útiles que usted debe familiarícese al crear sus propios comandos. También tiene un Logger disponible en $this->logger.

class Higgs\CLI\BaseCommand
call(string $command[, array $params = []])
Parámetros:
  • $comando (string) – el nombre de otro comando al que llamar.

  • $params (array) – Argumentos CLI adicionales para poner a disposición de ese comando.

Este método le permite ejecutar otros comandos durante la ejecución de su comando actual:

<?php

$this->call('command_one');
$this->call('command_two', $params);
showError(Throwable $e)
Parámetros:
  • $e (Throwable) – la excepción que se utilizará para informar errores.

Un método conveniente para mantener una salida de error clara y consistente a la CLI:

<?php

try {
    // ...
} catch (\Exception $e) {
    $this->showError($e);
}
showHelp()

Un método para mostrar la ayuda del comando: (uso, argumentos, descripción, opciones)

setPad(string $item, int $max, int $extra = 2, int $indent = 0) string
Parámetros:
  • $item (string) – el elemento de cadena.

  • $max (entero) – El tamaño máximo.

  • $extra (integer) – cuántos espacios adicionales agregar al final.

  • $indent (entero) – Los espacios de sangría.

Rellena nuestra cadena para que todos los títulos tengan la misma longitud para alinear bien descripciones arriba:

use Higgs\CLI\CLI;

$length = max(array_map('strlen', array_keys($this->options)));

foreach ($this->options as $option => $description) {
    CLI::write(CLI::color($this->setPad($option, $length, 2, 2), 'green') . $description);
}
/*
 * Output will be:
 *  -n     Set migration namespace
 *  -g     Set database group
 *  --all  Set for all namespaces, will ignore (-n) option
 */
getPad($array, $pad)

Obsoleto desde la versión 7.0.5: Utilice Higgs\CLI\BaseCommand::setPad() en su lugar.

Parámetros:
  • $array (array) – La matriz $key => $value.

  • $pad (entero) – Los espacios del pad.

Un método para calcular el relleno para la salida de la matriz $key => $value. El relleno se puede utilizar para generar una tabla formateada en CLI.