Como crear comando de consola en Magento 2

How To : Como crear comando de consola en Magento 2

Antiguamente para las versiones previas de Magento se usaban scripts PHP para cada acción y era necesario pensar donde colocarlo en shell, en la raiz.

Esta es una de las grandes mejoras de Magento2 la creación de comandos de consola CLI.

Este desarrollo puede ser  más sencillo si has programando anteriormente con Symfony y has creado tus comandos.

Como bien sabemos Magento 2 usa los componentes Console, EventDispatcher y Process de Symfony.

Este ejemplo es realmente básico para poder centrarse en los componentes mínimos para crear un comando en Magento 2.

Aunque es un ejemplo para vamos a proceder a crear una estructura de directorios de módulo estándar de Magento 2

code/<Vendor>/<ModuleName>
code/<Vendor>/<ModuleName>/etc
code/<Vendor>/<ModuleName>/etc/module.xml
code/<Vendor>/<ModuleName>/etc/di.xml
code/<Vendor>/<ModuleName>/registration.php
code/<Vendor>/<ModuleName>/Console
code/<Vendor>/<ModuleName>/Console/Command/<Comando>Command.php

Crear code/<Vendor>/<ModuleName>/etc/module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
 <module name="<Vendor>_<ModuleName>" setup_version="1.0.0">
 </module>
</config>

Crear code/<Vendor>/<ModuleName>/etc/di.xml

<?xml version="1.0"?>
	<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
		<type name="Magento\Framework\Console\CommandList">
			<arguments>
				<argument name="commands" xsi:type="array">
					<item name="<comando>" xsi:type="object"><Vendor>\<ModuleName>\Console\Command\<Comando>Command</item>
				</argument>
			</arguments>
		</type>
	</config>

Crear code/<Vendor>/<ModuleName>/registration.php

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
 \Magento\Framework\Component\ComponentRegistrar::MODULE,
 '<Vendor>_<ModuleName>',
 __DIR__
);

Crear code/<Vendor>/<ModuleName>/Console/Command/<Comando>Command.php

<?php 
namespace <Vendor>\<ModuleName>\Console\Command;


use Symfony\Component\Console\Command\Command;
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 <Comando>Command extends Command
{
 
    protected function configure()
    {
/*
   No es obligatorio el uso de PSR <modulename>:<comando>
*/
        $this->setName('<modulename>:<comando>')->setDescription('Descripción del comando');
    }
 
    protected function execute(InputInterface $input, OutputInterlface $output)
    {
        $output->writeln('Ejemplo');
    }
 
}

Repositorio en gitHub del código