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
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.
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
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.
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.
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.
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.
Caso ocorra algum erro, o email e histórico continuam sendo registrados.
Top comments (7)
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.
Tem como cadastrar uma tarefa mais de 1 vez, vc pode cadastrar uma tarefa configurando com as preferências de cada usuário
Não entendi muito bem, você poderia exemplificar (desenhar) para que eu possa tentar reproduzir?
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.
laravel.com/docs/10.x/artisan#argu...
github.com/robersonfaria/laravel-d...
Show! Muito top.
Muito importante, eu tenho um Cron crucial mas que fica meio obscuro de saber o que tá acontecendo. Vou implementar.
Simm, exatamente nesses casos que é interessante o uso, da pra acompanhar o que aconteceu em cada rotina e gerenciar elas bem mais facilmente!