DEV Community

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

Posted on

Que tal automatizar tarefas com Artisan? #2

Na primeira parte deste artigo vimos alguns conceitos básicos sobre o Artisan.

Nesta segunda e última parte vamos mais a fundo na classe criada, fazendo alterações nas propriedades e incrementando o método handle().


Para iniciar vamos alterar a propriedade $signature para 'project:test'.

Em seguida vamos editar a propriedade $description mudando o valor atual para 'Execute some commands using Artisan'.

Para confirmar as alterações vamos ao terminal, no diretório raiz do projeto e digitamos o seguinte:

php artisan help project:test
Enter fullscreen mode Exit fullscreen mode

👇

Getting help from MyCommand

⚠️ Faremos algumas interações com banco de dados. Portanto, a partir deste ponto, vou assumir que você já tenha realizado esta configuração.

Para obter detalhes sobre conexão com banco de dados em aplicações Laravel sugiro dar uma lida neste post.


Chamando outros comandos

Com uma lista tão extensa de comandos disponíveis nada mais justo que poder utilizá-los não acha?

O comando é semelhante ao que seria no terminal. Por exemplo, para executar uma migração digitaríamos o seguinte no terminal:

php artisan migrate
Enter fullscreen mode Exit fullscreen mode

Para executar a mesma ação dentro da classe de comandos que criamos, faríamos assim:

$this->call('migrate');
Enter fullscreen mode Exit fullscreen mode

Lembrando que, quando falamos da classe MyCommand todas as ações devem ficar dentro do método handle().


Por enquanto, sem novidade. Entretanto surge a necessidade de criarmos usuários fictícios para a aplicação.

Sem problemas. 😎
👇

php artisan db:seed
Enter fullscreen mode Exit fullscreen mode

Embora estas ações possam ser executadas individualmente sem muita dificuldade, não seria mais produtivo executá-las com uma única instrução? 😕

Com o editor de código de sua preferência, vamos modificar a classe MyCommand, mais especificamente o método handle(), que deve ficar como mostrado abaixo:

$this->call('migrate');
$this->call('db:seed');
Enter fullscreen mode Exit fullscreen mode

Mas, antes de testar as alterações, vamos editar a classe \database\seeders\DatabaseSeeder.php de forma que sejam criados usuários aleatórios para nossa aplicação. Precisamente, 10.

Esta modificação é bem simples e pode ser vista logo a seguir:

public function run()
{
    \App\Models\User::factory(10)->create();
}

Enter fullscreen mode Exit fullscreen mode

Salve as alterações e volte para o terminal, no diretório raiz da aplicação, para executarmos o comando que criamos:

php artisan project:test
Enter fullscreen mode Exit fullscreen mode

👇

Executing MyCommand class

Interessante não?


Interagindo com o terminal

E se for necessário reiniciar a migração?

Para isso basta que informemos opção 'refresh' logo após o comando para migrar.

Porém este comportamento não deve ficar engessado na aplicação. Em outras palavras nem todos os projetos precisão ter sua migração reiniciada.

Neste caso vamos transferir para o desenvolvedor a decisão de quando reiniciar ou não a migração.

A classe MyCommandextende de Illuminate\Console\Command.php, o que significa que todos os métodos (públicos ou protegidos) da classe pai estarão disponíveis.

E para nos ajudar a resolver nessa decisão, faremos isso utilizando o método confirm(). Como o próprio nome sugere, será solicitada uma confirmação do desenvolvedor para a mensagem que será mostrada. O retorno deste método é um valor booleano.

Utilizando uma abordagem menos ortodoxa, vamos criar uma variável para armazenar o valor :refresh quando o desenvolvedor desejar reiniciar a migração e vazio para respostas negativas.

Uma sugestão de código para solucionar essa questão está logo abaixo:

public function handle()
{
    $fresh_migration = ($this->confirm('Refresh migration?') ? ':refresh' : '');

    $this->call('migrate'.$fresh_migration);
    $this->call('db:seed');
    return 0;
}
Enter fullscreen mode Exit fullscreen mode

👇


Note que, por padrão, a opção selecionada será 'não'. Esta configuração pode ser modificada adicionando truecomo parâmetro, logo após a mensagem, ficando assim:

$refresh_migration = ($this->confirm('Refresh migration?', true) ? ':refresh' : '');
Enter fullscreen mode Exit fullscreen mode

Utilizando outras classes dentro da aplicação

Esta abordagem é bem interessante e já facilita bastante a vida do desenvolvedor. 😒 Mas surgiu a necessidade de criarmos um usuário específico. Como resolver?

Uma das maneiras de solucionar este problema é alterar a classe \database\seeders\DatabaseSeeder.php e inserir o código para esse usuário. Esta solução fará com que o usuário tenha sempre a mesma senha, o que às vezes pode não ser uma boa estratégia.

Outra solução é perguntar ao desenvolvedor se ele deseja ou não criar um usuário.

Voltando ao editor de código, logo abaixo do comando db:seed vamos adicionar uma nova linha com o método $this->confirm(), abrindo um novo bloco de instruções em seguida:

if ($this->confirm('Create a new user?')) {
//
}

Enter fullscreen mode Exit fullscreen mode

Dentro desse bloco crie três variáveis conforme o exemplo abaixo:

$name = null;
$email = null;
$password = null;
Enter fullscreen mode Exit fullscreen mode

Em seguida, pedido ao desenvolvedor que informe um nome para o novo usuário.

while(!$name) {
    $name = $this->ask('Please give us a name');
}

Enter fullscreen mode Exit fullscreen mode

Note que utilizo um laço do tipo while() que só será finalizado quando a variável $name possuir um valor.

Vamos repetir esta técnica para o e-mail e para a senha.

while(!$email) {
    $email = $this->ask('Now, a valid email');
}

while(!$password) {
    $password = $this->ask('At last, a password');
}
Enter fullscreen mode Exit fullscreen mode

Mas a senha deveria ficar oculta, certo?

Resolvemos essa dificuldade substituindo o método $this->ask() pelo método $this->secret(), ficando assim:

while(!$password) {
    $password = $this->secret('At last, a password (don\t worry..no one can see it)');
}
Enter fullscreen mode Exit fullscreen mode

Agora que obtemos o mínimo de informações para um novo usuário da aplicação, vamos criar o modelo desse usuário, persistindo-o no banco de dados em seguida.

⚠️ Não se esqueça de importar o modelo User (use App\Models\User;).

$new_user = new User;
$new_user->name = $name;
$new_user->email = $email;
$new_user->password = bcrypt($password);

$new_user->save();
Enter fullscreen mode Exit fullscreen mode

E para ter certeza que o usuário foi realmente persistido, basta mostrar o id dele.

$this->warn('New user created sucessfully with id:  "'.$new_user->id."'");
Enter fullscreen mode Exit fullscreen mode

Por fim, mostramos uma mensagem informando que todas as tarefas foram realizadas com sucesso.

return $this->info('All tasks completed');
Enter fullscreen mode Exit fullscreen mode

👇👇👇


Conclusão

O framework Laravel é uma ferramenta poderosa em vários sentidos:

  • acelera o desenvolvimento
  • facilita a automatização de atividades
  • possui código aberto

A única limitação é a sua imaginação.

Obrigado pela leitura e até breve. 😃

Top comments (0)