DEV Community

Pedro Paulo Silva
Pedro Paulo Silva

Posted on

Gerenciando Tarefas Agendadas do Laravel no Banco de Dados

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 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, 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
Enter fullscreen mode Exit fullscreen mode

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

php artisan migrate
Enter fullscreen mode Exit fullscreen mode

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

php artisan vendor:publish --provider="RobersonFaria\DatabaseSchedule\DatabaseSchedulingServiceProvider" --tag="config"
Enter fullscreen mode Exit fullscreen mode

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

alt text

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 para definir quem poderá acessar.

Criando a Tarefa Agendada

Para exemplo vamos criar uma tarefa rodando:

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

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;
}
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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

alt text

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

Para entender todas as opções e parâmetros que podem ser configurados na tarefa agendada visite a documentação.

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

alt text

Executando as tarefas agendadas

Para testar localmente vamos rodar o comando:

php artisan schedule:run
Enter fullscreen mode Exit fullscreen mode

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

alt text

alt text

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

alt text

alt text

Referências

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

Top comments (7)

Collapse
 
monteiroconsultoria profile image
monteiroconsultoria

Boa tarde, existe alguma forma de fazer o cadastro de tarefas ser vinculada a um cadastro de usuário.
Exemplo: a tarefa x é executada para um usuário e a y para outro usuário? Pergunto isso pois estou fazendo um ambiente sass e queria dar autonomia ao usuário de agendar suas tarefas.

Collapse
 
pedropms profile image
Pedro Paulo Silva

Tem como cadastrar uma tarefa mais de 1 vez, vc pode cadastrar uma tarefa configurando com as preferências de cada usuário

Collapse
 
monteiroconsultoria profile image
monteiroconsultoria

Não entendi muito bem, você poderia exemplificar (desenhar) para que eu possa tentar reproduzir?

Thread Thread
 
pedropms profile image
Pedro Paulo Silva

Os comandos do laravel podem receber arguments e options, no agendador de tarefas vc pode configurar esses arguments para ser o ID do usuário que vc quer.

Image description

laravel.com/docs/10.x/artisan#argu...
github.com/robersonfaria/laravel-d...

Collapse
 
moreiraandre profile image
André Moreira

Show! Muito top.

Collapse
 
insign profile image
Hélio oliveira

Muito importante, eu tenho um Cron crucial mas que fica meio obscuro de saber o que tá acontecendo. Vou implementar.

Collapse
 
pedropms profile image
Pedro Paulo Silva

Simm, exatamente nesses casos que é interessante o uso, da pra acompanhar o que aconteceu em cada rotina e gerenciar elas bem mais facilmente!