Laravel: Criando Comandos

Lucas Pires
Aug 26, 2017 · 4 min read

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-example

Registrando Comando

Agora precisamos criar nosso comando e dizer ao Laravel que ele existe, precisamos registrar ele, e isso pode ser feito de duas formas:

  1. Via closure em routes/console.php
  2. ou registrando ele na propriedade $commands em app/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 DBDescribeTable

O 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:

  • $signature e $description utilizados quando nosso comando é exibido após executar php 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:

  1. Recuperar o nome da tabela que vem no argumento {table} do comando.
  2. Exibir uma mensagem de erro caso a tabela não exista.
  3. 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

)
Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade