Múltiplas validações com o Laravel Pipeline
Pedro Paulo Silva
Posted on March 7, 2022
É quase certo que você já esteve na situação de ter que validar um objeto através de diversas condições. Nessas situações o comum é ir adicionando if's, cada um validando uma condição específica. E não há nada de errado nisso, é uma maneira prática e você resolveu seu problema inicial.
Contudo, com o passar do tempo mais condições vão aparecendo e o que eram 3 if's agora são 15 e seu código começa a ficar muito complexo (se você usa alguma ferramenta para inspecionar o código como o PHP Mess Detector, ele literalmente irá reclamar do seu código dizendo que está complexo demais).
Para diminuir essa complexidade de um trecho de código, podemos aplicar um pattern chamado Pipeline Pattern.
Resumidamente esse pattern cria uma "linha de montagem" com várias etapas sequenciais e passa seu objeto através dessas etapas, retornando o resultado ao final. Essa "linha de montagem" pode, por exemplo, manipular seu objeto, adicionando, atualizando ou removendo atributos. E também pode realizar validações nesse objeto, que é o que faremos aqui.
No Laravel temos uma implementação desse pattern (Illuminate\Pipeline\Pipeline) e é ela que vamos usar hoje para refactor o trecho de código a seguir.
Exemplo
Refatoração
Primeiramente vamos criar 3 classes para fazer as validações isoladamente.
E agora vamos usar a implementação da Pipeline que existe Laravel.
Dessa forma o objeto $usuario
irá passar por todas as validações e ao final será retornado.
Você pode, também, reaproveitar as validações já existentes e organizá-las de outras formas, criando outras validações, por exemplo, uma que só valide os meios de contato do usuário. Como abaixo:
Conclusão
Como podemos ver, com o uso desse pattern as reponsabilidades de cada validação ficam separadas e muito melhor organizadas. Assim permitindo que a adição, exclusão e manutenção das validações seja feita de maneira muito mais fácil.
Posted on March 7, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.