Por que facades são um problema seu e não do Laravel?

Vinicius Reis
May 23, 2015 · 4 min read

Muito se fala sobre o design de software do Laravel. Entre outras coisas se crítica muito o Eloquent (model) e os Facades. Não falarei do Eloquent, falarei das facades, e por que são tão “polêmicas”.

Facades do Laravel não são as Facades que você conhece

A primeira vista os facades do Laravel são métodos estáticos, porém este é o maior engano que alguém pode cometer. Os Facades são um acessor “com syntax suggar” para as instancias que são resolvidas pelo IoC container. Você pode customiza-los em configs/app.php.
É importante frisar que os alias no laravel são “atalhos” para qualquer classe, não apenas facades. Você ainda pode acessar os facades diretamente, sem a necessidade do uso dos alias.

Primeiro você precisa entender por que um método estático é ruim.

Métodos estáticos em geral são difíceis de testar e criam dependências difíceis entre classes alem de quebrar princípios de OO. Você não pode estender métodos estáticos.
Eles não são “horríveis”, mas você deve tomar cuidado ao usa-los.

Você agora se pergunta: Então o que é Route::get é afinal de contas?
Simples pequeno gafanhoto, um atalho para isto app(‘route’)->get() ainda digo mais jovem padawan isso é um atalho para isso:

Você pode dizer agora: “grandes merda”, isso só prova que o Laravel é muito “mágico”

Lívido engano, você sabe o que é Dependency Injection? Se não sabe leia este belo artigo.

Leu? Entendeu tudo? Então saiba que o Laravel trabalha com um Service Container. Resumidamente o Service Container é o carinha que guarda todas as instâncias dos objetos que vamos precisar durante o ciclo de desenvolvimento da nossa aplicação.

Quer ver ele na prática? Vamos a um exemplo real.

Todas elas funcionam (muito bem obrigado) fora do Laravel, o bigdeal do pacote é a classe SEOToolsServiceProvider. Ela sim é especial para o Laravel, nela eu “ensino” ao Laravel o que ele precisa fazer para disponibilizar minhas classes no projeto em que ele está instalado.
Essa classe é especial apenas para o Laravel, e eu posso criar classes para outros Frameworks que eu decida dar suporte, sem o menor problema.

Reparem nos comandos singleton e bind elas são as assinaturas que o Laravel precisa para “disponibilizar” meu pacote para os projetos que vão usar ele.
Com essa configuração o Laravel é inteligente o suficiente para disponibilizar uma instância única para minha classe, assim um controller precisa apenas fazer referência ao contrato de qualquer uma das minhas classes e nosso DI faz o resto do trabalho.

Sabe a real mágica nisso tudo? O desenvolvedor que estiver usando o pacote e se deparar com uma situação onde a classe não dá suporte ou precisa mudar algum comportamento precisa apenas mudar o valor da chave no Service Container, e ele terá uma implementação única para resolver o problema dele!
Sabe outra coisa fantástica? Você pode fazer isso em todas as classes do Laravel.

Uaul! Laravel faz isso tudo?
Não amigo, php faz isso tudo!

Lembra das nossas assinaturas no Service Provider? É aqui que novamente ela entra.

Quando você criou o facade você disse a ele qual a chave que ele deve procurar no nosso container, e pronto é isso que ele faz ele “resolve” a dependência, instância a classe para você e faz a chamada do método que você pediu.

Muito bacana? Si, pero no mucho.

Não sou “xiita”, muito menos “escovador de bits” mas há possibilidade perda de desempenho aqui, além é claro do acoplamento, que mesmo sendo muito baixo existe.

Repare no método que é executado sempre que um método é solicitado ao facade:

Imagina chamar isso 9, 15, 28 vezes seguidas?!
Pode ser cômodo mas isso pode pesar na performance…
Além é claro que o uso massivo de facades no desenvolvimento pode dificultar seus teste.

Há maneiras de se contornar isso:

Os dois são “mais lentos” se comparado ao último, além disso último vai facilitar seus testes!

Entenda, facades estão longe de serem uma coisa ruim, são uma mão na roda em dezenas situações principalmente em suas views, onde permitem que você escreva menos.
Eu mesmo já usei facades como classe de transporte de informações dentro da minha aplicação, e novamente elas funcionam muito bem obrigado.

No final você que decide onde, como, quando e se vai usar as facades.
O Laravel é popular por que é flexível e simples ao mesmo tempo. Ele aplica velhos e novos conceitos de desenvolvimento, é problema seu fazer ou não bom uso deles.


Por fim quero deixar um recado pros recalcados: se seu Framework é melhor que o Laravel pouco me importa!
Só lembre-se: o código fonte tudo sabe, tudo vê, eu cuido do meu, você cuida do seu?


Meus agradecimentos ao @zizaco e ao @fhferreira pela ajuda na revisão do artigo. :)

by Vinicius Reis

Meus posts

Vinicius Reis

Written by

Fiquei sem meus peões, meu cavalo, minha torre, meu bispo… E até a rainha… Mas ainda é muito cedo para um xeque-mate. Roy Mustang — Fullmetal Alchemist

by Vinicius Reis

Meus posts

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade