Cómo crear un comando para la Consola en Magento2

Comandos para la Consola de Magento2

Sigue el aprendizaje/descubrimiento/experimento a través del módulo Barbanet_SampleModule.

Una de las esperadas y ultra mencionadas novedades de Magento2 ha sido la consola nativa para realizar muchas de las operaciones administrativas.

Lo que sigue a continuación es un ejemplo más que sencillo (en todo sentido) sobre cómo agregar un nuevo comando desde nuestro módulo a la consola.

Crear un nuevo comando requiere, al menos, de dos archivos:

  • etc/di.xml
  • Console/Clase.php

Claramente, el nombre Clase.php dependerá del módulo y/o comando que estemos agregando.

En el módulo, dado que ya existía el archivo etc/di.xml, simplemente necesito agregar la siguiente definición:

    <type name="Magento\Framework\Console\CommandList">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="sampleModuleHello" xsi:type="object">Barbanet\SampleModule\Console\Hello</item>
            </argument>
        </arguments>
    </type>

El contenido total ha quedado con:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Theme\Block\Html\Footer" type="Barbanet\SampleModule\Block\Html\Footer" />
    <type name="Magento\Framework\Console\CommandList">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="sampleModuleHello" xsi:type="object">Barbanet\SampleModule\Console\Hello</item>
            </argument>
        </arguments>
    </type>
</config>

Y ahora, según hemos definido en el nodo item con Barbanet\SampleModule\Console\Hello, creamos nuestro archivo Console/Hello.php, con el siguiente contenido.

<?php
namespace Barbanet\SampleModule\Console;
 
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
 
/**
 * Class Hello
 * @package Barbanet\SampleModule\Console
 */
class Hello extends Command
{
 
    protected function configure()
    {
        $this->setName('samplemodule:hello');
        $this->setDescription('Barbanet_SampleModule Hello sample command');
    }
 
    /**
     * @param InputInterface $input
     * @param OutputInterface $output
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln("My Sample Module message: Hello World!");
    }
}

Nótese que el nombre que le he asignado a mi comando es: samplemodule:hello.

Si ejecutamos en la consola:

bin/magento list

Nuestro comando no aparecerá. Esto se debe a que tenemos que limpiar cache, y para esto, usaremos la misma consola con:

bin/magento cache:flush

Ahora si, al ejecutar:

bin/magento list

Nuestro comando aparece. Si ejecutamos:

bin/magento samplemodule:hello

Veremos el mensaje que definimos en nuestra clase:

My Sample Module message: Hello World!

Y eso es todo. Ta tenemos un primer comando definido.

Todo el ejemplo se encuentra implementado en la versión 2.9.0 del módulo.