DEV Community

Cover image for Que tal automatizar tarefas com Artisan? #1
Marcio Policarpo
Marcio Policarpo

Posted on • Updated on

Que tal automatizar tarefas com Artisan? #1

Um dos melhores recursos que o framework Laravel nos proporciona é o Artisan.

Artisan é uma interface de linha de comando disponível a partir do diretório raiz da aplicação, nos auxiliando a realizar diversas tarefas dentro do projeto.

Para obter uma lista dos comandos disponíveis, basta acessar o terminal e digitar o seguinte:

php artisan list
Enter fullscreen mode Exit fullscreen mode

A grande maioria dos desenvolvedores habituados com o framework Laravel, alguns comandos são bem comuns. Por exemplo, criar uma migração:

php artisan make:migration <nome_da_migracao>
Enter fullscreen mode Exit fullscreen mode

Ou talvez uma controller:

php artisan make:controller <nome_da_controller>
Enter fullscreen mode Exit fullscreen mode

Alguns desses comandos trazem opções que agilizam a criação de outras classes de uma única vez. 😮

Quer criar um modelo e ao mesmo tempo a migração❓

php artisan make:model <nome_do_modelo> -m
Enter fullscreen mode Exit fullscreen mode

Perceba que ao adicionar o parâmetro opcional '-m' o artisan é instruído a criar também um arquivo de migração para o modelo.

Para obter a lista de todas as opções para o comando make:model informamos o seguinte:

php artisan help make:model
Enter fullscreen mode Exit fullscreen mode

Todos os comandos disponíveis no projeto, incluindo descrições, argumentos e opções, podem ser exportados para txt, xml, jsonou md. Basta adicionar a opção --format=<formato>. Por exemplo, se quiséssemos mostrar a ajuda em formato json para o comando citado logo acima, seria esta a instrução a ser informada no terminal:

php artisan help make:model --format=json
Enter fullscreen mode Exit fullscreen mode

E esta, a saída: 👇

{"name":"make:model","description":"Create a new Eloquent model class","usage":["make:model [-a|--all] [-c|--controller] [-f|--factory] [--force] [-m|--migration] [--morph-pivot] [--policy] [-s|--seed] [-p|--pivot] [-r|--resource] [--api] [-R|--requests] [--test] [--pest] [--] <name>"],"help":"Create a new Eloquent model class","definition":{"arguments":{"name":{"name":"name","is_required":true,"is_array":false,"description":"The name of the class","default":null}},"options":{"all":{"name":"--all","shortcut":"-a","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Generate a migration, seeder, factory, policy, resource controller, and form request classes for the model","default":false},"controller":{"name":"--controller","shortcut":"-c","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Create a new controller for the model","default":false},"factory":{"name":"--factory","shortcut":"-f","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Create a new factory for the model","default":false},"force":{"name":"--force","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Create the class even if the model already exists","default":false},"migration":{"name":"--migration","shortcut":"-m","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Create a new migration file for the model","default":false},"morph-pivot":{"name":"--morph-pivot","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Indicates if the generated model should be a custom polymorphic intermediate table model","default":false},"policy":{"name":"--policy","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Create a new policy for the model","default":false},"seed":{"name":"--seed","shortcut":"-s","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Create a new seeder for the model","default":false},"pivot":{"name":"--pivot","shortcut":"-p","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Indicates if the generated model should be a custom intermediate table model","default":false},"resource":{"name":"--resource","shortcut":"-r","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Indicates if the generated controller should be a resource controller","default":false},"api":{"name":"--api","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Indicates if the generated controller should be an API resource controller","default":false},"requests":{"name":"--requests","shortcut":"-R","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Create new form request classes and use them in the resource controller","default":false},"test":{"name":"--test","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Generate an accompanying PHPUnit test for the Model","default":false},"pest":{"name":"--pest","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Generate an accompanying Pest test for the Model","default":false},"help":{"name":"--help","shortcut":"-h","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Display help for the given command. When no command is given display help for the <info>list<\/info> command","default":false},"quiet":{"name":"--quiet","shortcut":"-q","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Do not output any message","default":false},"verbose":{"name":"--verbose","shortcut":"-v|-vv|-vvv","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug","default":false},"version":{"name":"--version","shortcut":"-V","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Display this application version","default":false},"ansi":{"name":"--ansi","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Force (or disable --no-ansi) ANSI output","default":null},"no-ansi":{"name":"--no-ansi","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Negate the \"--ansi\" option","default":false},"no-interaction":{"name":"--no-interaction","shortcut":"-n","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Do not ask any interactive question","default":false},"env":{"name":"--env","shortcut":"","accept_value":true,"is_value_required":false,"is_multiple":false,"description":"The environment the command should run under","default":null}}},"hidden":false}
Enter fullscreen mode Exit fullscreen mode

⚠️ Alguns comandos exigirão que determinadas bibliotecas estejam instaladas na aplicação, como Laravel Breeze por exemplo.


Criar comandos personalizados

Durante o processo de desenvolvimento é comum repetirmos diversas ações, principalmente no início em que muitas configurações precisam ser feitas.😭

Para tentar amenizar em partes esse sofrimento o framework Laravel possibilita criarmos nossos próprios comandos afim de aumentarmos a produtividade através da redução de tarefas repetitivas. 👏

Mas antes de começar, que tal dar uma olhada na lista de opções para criação de comandos personalizados❓

Para isso vamos novamente acessar o terminal no diretório raiz da aplicação e digitar o seguinte:

php artisan help make:command
Enter fullscreen mode Exit fullscreen mode

👇

Make commands help

Perceba que todos os comandos possuem uma estrutura comum:

  • description: descrição do que o comando faz
  • usage: como o comando deve ser executado
  • arguments: argumentos para executar o comando
  • options: opções deste comando

Chega de teoria e vamos para a parte prática. 👍

Acessando novamente o terminal no diretório raiz da aplicação, digite o seguinte:

php artisan make:command MyCommand
Enter fullscreen mode Exit fullscreen mode

Com o editor de código de sua preferência, abra a pasta do projeto Laravel para termos acesso a toda sua estrutura.

Repare que uma nova classe foi criada no diretório \app\Console\Commands_ e ela extende de _\Illuminate\Console\Command.php.

👇

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class MyCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:name';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        return 0;
    }
}
Enter fullscreen mode Exit fullscreen mode

Explicando o código

protected $signature

Esta propriedade protegida diz ao Artisan como executar o comando que criamos. Veja que está com o valor 'command:name'. Então para executar este comando no terminal precisaremos digitar o seguinte:

php artisan command:name
Enter fullscreen mode Exit fullscreen mode

Se fizermos isto neste momento nada será retornado porque devemos codificar o método handle(). Mas já já chegamos nele.😃


protected $description

O conteúdo desta propriedade será mostrado quando buscarmos informações sobre os comandos. Por exemplo, se digitarmos no termimal a seguinte instrução:

php artisan help command:name
Enter fullscreen mode Exit fullscreen mode

Este será o resultado (em destaque):

👇

Highlighted, command description


public function handle()

É aqui que a mágica acontece. E para começar com um exemplo bem simples, vamos editá-lo para ficar igual ao mostrado a seguir:

public function handle()
{
    $this->info("Hi, I'm here to help you ;)");
    return 0;
}
Enter fullscreen mode Exit fullscreen mode

Agora quando executarmos o comando php artisan command:name no terminal veremos o seguinte retorno:

👇

Calling the new command


Na segunda parte deste artigo veremos:

  • como executar outros comandos do artisan
  • receber e tratar inputs do terminal
  • criar e persistir um usuário através do modelo

Até breve. 😎

Top comments (0)