Contextualizando
O que é um CLI?
A CLI (Command Line Interface, ou Interface de Linha de Comando) é um ambiente onde é possível interagir através do terminal para a execução de tarefas específicas pelas linhas de comando digitados pelo usuário, e após a execução da tarefa, exibirá o retorno do processo no próprio terminal.
Cada linha de comando do terminal é responsável pela execução de uma funcionalidade específica, podendo definir o valor de alguma configuração ou a realização de uma tarefa.
Código para criar um comando
Saiba mais sobre definir valores no construtor de com o type no post "Como definir valores específicos dos argumentos do construtor no Magento 2 utilizando type".
di.xml
Configurações Type descrevem o tipo de uma dependência do construtor de uma determinada classe e qual valor instanciar. Para declarar um comando é necessário injetar na classe \Magento\Framework\Console\CommandListInterface
via configuração type, dentro do arquivo di.xml
, seguindo a estruturas de pastas \{Vendor}\{Module}\etc\{area}\di.xml
.
A configuração que será injetada deve ser do tipo object
, referenciando o caminho da classe onde terá as definições do comando.
<?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="{comandName}" xsi:type="object">{Vendor}\{Module}\Console\{Directory}\{ConsoleClass}</item> </argument> </arguments> </type> </config>
Console
A classe de Console deverá seguir a estrutura de pastas \{Vendor}\{Module}\Console\{Directory}\{ConsoleClass}
e estender a classe \Symfony\Component\Console\Command\Command
. Esta classe deverá possuir o método protegido configure()
, que será utilizado para definir o nome, a descrição, os argumentos e outras caracterísiticas que o comando possuirá. A classe também possuirá o método protegido execute()
, que será o utilizado para executar as tarefas quando o comando for chamado através do terminal.
É possível, mas não obrigatório, implementar o método interact(\Symfony\Component\Console\Input\InputInterface $input, \Symfony\Component\Console\Output\OutputInterface $output)
, este método é executado antes da validação, ou seja, é o único lugar onde o comando pode interativamente perguntar por valores dos argumentos que não foram passados no comando do terminal.
<?php namespace {Vendor}\{Module}\Console\{Directory}; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Input\InputDefinition; class {ConsoleClass} extends Command { protected function configure(): void { // Set the name of the comand that will be used in the prompt $this->setName('{section}:{command}'); // Set the description for the comand $this->setDescription('{Console description}'); // Sets an array of argument and option instances $this->setDefinition({[]}); // Add an arguments to command $this->addArgument('{argumentName}'); // Add an option to command $this->addOption('{optionName}'); // Sets the process title of the command. This feature should be used only when creating a long process command $this->setProcessTitle('{titleProcess}'); // Sets whether or not the command should be hidden from the list of commands $this->setHidden({true/false}); // Sets the help for the command $this->setHelp('{Text to help}'); // Sets the aliases for the command $this->setAliases({['{aliasName}']}); // Add a command usage example $this->addUsage('{The usage}'); parent::configure(); } protected function execute( InputInterface $input, OutputInterface $output ): void { // Code to execute when running the command } protected function interact( InputInterface $input, OutputInterface $output ): void { // Code to execute before input } }
Ao definir o nome do comando e a tarefa que será executada ao chamar o comando pelo terminal, basta testar o comando no terminal, após habilitar as alterações (conforme abaixo).
bin/magento {section}:{command}
Finalização
Valores entre chaves (
{test}
) devem ser alterados na implementação do código.
Habilitando as alterações
Apague os arquivos que são gerados na compilação do Magento e execute o comando PHP para gerar a configuração das injeções de dependência e todas as classes ausentes que precisam ser geradas (proxys, interceptors, etc) e para limpar todos os caches de armazenamento em cache do processos.
rm -rf var/generation/ rm -rf generated/ php bin/magento setup:di:compile php bin/magento cache:clean php bin/magento flush
Diretórios e Arquivos
Segue a a lista de diretórios e arquivos que devem ser criados.
- app/ - code/ - {Vendor}/ - {Module}/ - etc/ - module.xml - di.xml - Console/ - {Directory}/ - {ConsoleClass}.php - registration.php - composer.json
Top comments (0)