05/02/2025, um dos dias em que realizei um dos meus maiores sonhos desde que conheci o Laravel.
Sempre acompanho as atualizações do Laravel semanalmente, e uma das últimas novidades que me interessou bastante foi algo simples, mas que gostei muito. Tratava-se de uma classe helper para realizar validações usando o bom e velho POO, em vez de escrever validações baseadas em strings (Laravel News).
Normalmente, as validações no Laravel são escritas assim:
public function rules(){ return [ 'birth_date' => 'date|date_format:d/m/Y|before:today' ];}
O que, para mim, não é nada legível, é fácil cometer erros de digitação e não há suporte a autocomplete.
Com a novidade do Laravel, as validações de datas ficaram assim:
public function rules(){ return [ 'birth_date' => [ Rule::date()->format('d/m/Y')->beforeToday(), ] ];}
Esse formato torna tudo muito mais legível. Não é necessário acessar a documentação para verificar como fazer uma validação. Usando IDEs como o PhpStorm, que oferecem autocomplete, isso facilita ainda mais, aumentando a produtividade.
Pensei nisso por alguns dias (rs), e comecei a questionar: por que isso só existe para datas? Resolvi seguir esse raciocínio e tentei implementar algo semelhante para validações numéricas.
Por exemplo, a regra digits
só pode ser aplicada a campos integer
, então é fácil acabar esquecendo regras como esta, poderiam aplicar automaticamente as regras necessárias para funcionar corretamente.
Clonei o projeto, li os termos de contribuições e comecei a implementação. O código do Laravel é bem simples, com namespaces bem organizados, e todos são refletidos nos testes. Basicamente, eu teria que criar dois novos arquivos: a minha feature e um arquivo de teste. Criei ambos. O segundo passo foi pensar em como seria a implementação, já que as validações numéricas já existiam, eu só precisava criar um wrapper. Dei uma olhada em como isso era feito em outras partes do Laravel e tentei seguir o mesmo padrão. Para minha surpresa, foi bem simples! Apenas escrevi métodos para todas as validações numéricas existentes no Laravel. No final, o resultado foi o seguinte:
public function rules(){ return [ // Antigo... 'score' => 'numeric|integer|multiple_of:10|lte:some_field|max:100',
// Após meu PR... 'score' => [ Rule::numeric() ->integer() ->multipleOf(10) ->lessThanOrEqualTo('some_field') ->max(100), ] ];}
Concorda que está muito mais legível? rs
Agora, nas próximas versões do Laravel, essa feature estará disponível. Embora tenha sido uma implementação simples, acredito que ela vai ajudar muito na produtividade ao escrever validações.
Confesso que achei que o PR não seria aprovado. O time do Laravel demorou quase uma semana para me dar qualquer tipo de resposta. Mas, na manhã de 05/02/2025, recebi a seguinte mensagem do próprio Taylor (criador do Laravel):
Thanks for your pull request to Laravel!
Unfortunately, I'm going to delay merging this code for now. To preserve our ability to adequately maintain the framework, we need to be very careful regarding the amount of code we include.
If applicable, please consider releasing your code as a package so that the community can still take advantage of your contributions!
E logo depois ele fechou o PR. Fiquei triste por um tempo, mas, depois de alguns minutos, ele voltou atrás, reabriu o PR, fez alguns ajustes de formatação e, em seguida, aprovou o PR, me tornando OFICIALMENTE um contribuidor do Laravel.
Foi um processo bem interessante de aprendizado. Nunca tinha contribuído para um projeto open source antes, e com certeza essa foi uma contribuição enorme para minha carreira. Esse é o primeiro PR, mas pretendo continuar contribuindo para esse projeto maravilhoso no futuro. Sem dúvida, estou muito feliz!
Link para meu Pull Request: PR no GitHub