
Laravel: Criando Comandos
Laravel vem com uma série de comandos que facilitam muito a nossa vida, desde comandos que ajudam a melhorar nossa produtividade durante o desenvolvimento até comandos que podem ser executados em produção para automatizar tarefas repetitivas.
Visão Geral
Laravel utiliza como base o Symfony Console para criação de interfaces para linha de comando (CLI), se investigarmos um pouco conseguimos ver que a classe base de todos os comandos do Laravel extende a classe de comandos do Symfony Console.
Laravel simplesmente cria uma camada de abstração sobre as classes do Symfony com alguns atalhos e conveniências que facilitam ainda mais a criação de comandos.
Instalação
Agora que você já conhece um pouco do que acontece em background com os comandos do Laravel, vamos ver um passo a passo sobre como criar nosso próprio comando.
Como exemplo nós vamos construir um simples comando que exibe no terminal toda a estrutura de uma tabela do nosso banco de dados, isso é um exemplo bem simples, mas você pode criar comandos para rodar tanto em densenvolvimento quanto em produção.
Vamos criar um novo projeto com o Laravel usando o Composer, que por acaso também foi construido usando o Symfony Console.
$ composer create-project --prefer-dist laravel/laravel cli-exampleRegistrando Comando
Agora precisamos criar nosso comando e dizer ao Laravel que ele existe, precisamos registrar ele, e isso pode ser feito de duas formas:
- Via closure em
routes/console.php - ou registrando ele na propriedade
$commandsemapp/Console/Kernel.php
Vamos escolher a segunda opção aqui, mas o routes/console.php funciona de uma forma bastante similar as rotas, acho que ele é muito útil quando você quer ir direto ao ponto e criar o seu comando, sem a necessidade de criar toda uma classe para isso.
Vamos criar a classe do nosso comando e registrar ele, o Artisan já vem com um comando que facilita a criação dessa classe.
$ php artisan make:command DBDescribeTableO comando make:command cria um arquivo com o mesmo nome do comando dentro da pasta app/Console/Commands , mas você pode colocar seus comandos em qualquer lugar, desde que o autoload do composer consiga carregá-los.
A estrutura de uma classe de comando é composta por duas propriedades e um método:
$signaturee$descriptionutilizados quando nosso comando é exibido após executarphp artisan list.- Método
handle(), chamado quando nosso comando é executado, todo o corpo do nosso comando deve ficar nesse método.
Vamos definir a assinatura e descrição do nosso comando da seguinte forma:
Agora que já temos nosso comando criado, com sinature e description definidos, vamos registrar ele em app/Console/Kernel.php :
A partir do Laravel 5.5 isso não é mais necessário, ele automaticamente registra todos os comandos criados ;)
Se agora você executar php artisan help db:describe você deveria ver algo parecido com isso:

Lógica do Comando
Toda a lógica do nosso comando ocorre no método handle() quando ele é executado, mas isso não significa que todo o nosso código precisa estar dentro deste método, é sempre recomendado criar comandos simples.
Se você precisa criar um comando muito complexo, é interessante abstrair a lógica dele para um service ou algo do tipo, e injetar isso via __construct no comando, assim você mantém o método handle() pequeno e simples de entender, e não quebra a única responsabilidade dele que é executar uma tarefa.
A lógica do nosso comando é bem simples:
- Recuperar o nome da tabela que vem no argumento
{table}do comando. - Exibir uma mensagem de erro caso a tabela não exista.
- Se existir, vamos exibir a estrutura dela em detalhes.
Com essa lógica nosso comando fica assim:
Se agora você executar php artisan db:describe someTableThatDontExist você deve ver algo parecido com isso:

Mas se você executar com uma tabela que existe no seu banco de dados, algo como php artisan db:describe users :

Pronto, temos o nosso próprio comando que consegue inspecionar a estrutura das nossas tabelas no banco de dados :D
Conclusão e Recomendações
Nesse tutorial cobrimos como criar e executar nossos próprios comandos, porém existem mais coisas que você pode fazer com comandos no Laravel, como criar questionários, confirmar ações, criar barras de progresso e etc, todas essas features são muito bem explicadas na documentação oficial.
Uma outra recomendação bem legal é o próprio Symfony Console, existem coisas muito legais nele que vão te ajudar a entender ainda mais como os comandos do Laravel funcionam.
Caso você esteja interessado em ver todo o código criado aqui, ele está disponível no meu GitHub:)
Qualquer dúvida, sugestão ou algo que esqueci de mencionar aqui, deixe nos comentários, vou ficar muito feliz em ler o seu comentário, até a próxima :D
