Gerenciando Tarefas Agendadas do Laravel no Banco de Dados
Tags: laravel, php, braziliandevs, tutorial
Published: 2021-06-18 20:55:04

Tarefas agendadas são uma ótima maneira de executar processos repetitivos de maneira automatizada em nossos projetos, basta definir as tarefas e escolher os momentos em que elas serão executadas e pronto, pode deixar o resto do trabalho com o [cron](https://en.wikipedia.org/wiki/Cron) do servidor.

Geralmente essa definição dos momentos em que as tarefas irão rodar fica dentro do projeto e acaba sendo suficiente em muitos casos, porém, essa maneira de gerenciamento acaba sendo um empecílio quando se precisa alterar o horário em que as tarefas serão executadas. Gerenciando dessa maneira, será necessário uma alteração no arquivo, e uma nova _release_ do projeto para as alterações terem efeito. Isso também restringe que o ajuste no horário da tarefa seja feito somente por um desenvolvedor.

Para resolver esse problema, podemos gerenciar as tarefas agendadas no banco de dados, fazendo com que apenas a alteração de um registro já altere o funcionamento da tarefa.

No Laravel temos o pacote: [Laravel Database Schedule](https://github.com/robersonfaria/laravel-database-schedule), que permite o gerenciamento das tarefas no banco de dados e ainda fornece uma interface para que a alteração das tarefas possa ser feita de maneira mais simples e por alguém sem tanto conhecimento de programação.

# Instalação

Para instalar a biblioteca vamos rodar:

```
composer require robersonfaria/laravel-database-schedule
```

Após a instalação precisamos rodar as _migrations_ para criar as tabelas usadas pela biblioteca:

```
php artisan migrate
```

Por último, exportar o arquivo de configurações:

```
php artisan vendor:publish --provider="RobersonFaria\DatabaseSchedule\DatabaseSchedulingServiceProvider" --tag="config"
```

No arquivo de configurações vamos alterar o __restricted_access__ para `false` para o teste. 

![alt text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cwejpmkvkyb3y4kn6uif.png)
 

__OBS:__ essa configuração deixa o dashboard de tarefas agendadas público, para restringir o acesso somente à usuários autorizados deixe a propriedade como `false` e consulte a [documentação](https://github.com/robersonfaria/laravel-database-schedule#dashboard-authorization) para definir quem poderá acessar.

# Criando a Tarefa Agendada

Para exemplo vamos criar uma tarefa rodando:

```
php artisan make:command NovoComando
```
E configuramos o comando dessa maneira:

```
protected $signature = 'comando:novo-comando';

protected $description = 'Novo comando teste';

public function handle(): int
{
    $this->info('Comando rodando!');
    return 0;
}
```

Normalmente, agora seria o momento em que iríamos cadastrar esse comando que criamos, no `Kernel.php` e configurariamos o horário para a tarefa rodar, mas usando o _database schedule_ não faremos isso.

# Agendando a Tarefa no Banco de Dados

Após iniciar o servidor com:

```
php artisan serve
```

Vamos acessar http://localhost:8000/schedule para entrar no dashboard.

![alt text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5jii2yvghjx4ac5h8axr.png)
 
No formulário, vamos escolher o comando que queremos agendar, a expressão cron que vai definir quando ocorrerá a execução e marcar a opção de envio de email caso ocorra uma falha na execução, para isso também vamos definir um email.

![alt text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/drj4uu7o3sqkifngzdva.png)

> Para entender todas as opções e parâmetros que podem ser configurados na tarefa agendada visite a [documentação](https://github.com/robersonfaria/laravel-database-schedule).

Após essa configuração podemos ver no dashboard nosso comando cadastrado.

![alt text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8q96hr0hgv944hsj3paw.png)

# Executando as tarefas agendadas

Para testar localmente vamos rodar o comando:

```
php artisan schedule:run
```

E depois do comando rodar, se acessarmos o email cadastrado e a sessão de __Histórico__ no dashboard veremos o resutado.

![alt text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/539au6dzj8rwz6cd5ht5.png)
 
![alt text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rk7ten4wx5lv7fn5o2ws.png)

Caso ocorra algum erro, o email e histórico continuam sendo registrados.

![alt text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jw5mvduyx1o0bf0k8lfw.png)

![alt text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3xx6jeib9fr8ux4ogyws.png)


# Referências

https://github.com/robersonfaria/laravel-database-schedule