[Tips & Tricks] Laravel Clean Code
Tags: laravel, clean, php, backend
Published: 2021-05-24 22:52:33

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/as7ripqed3k9tqi639i6.jpg)

E ai galera, neste artigo como o próprio título já fala, pretendo reunir algumas dicas para construirmos códigos mais limpos no Laravel. Todo bom desenvolvedor sabe o quanto é essencial termos um código "enxuto" e limpo, além de facilitar o entendimento ajuda os próximos devs que venham a pegar o seu código para manutenção. 

Nem todos os passos aqui contidos devem ser estritamente seguidos e menos ainda se tornarão regras absolutas. Estas são dicas e nada mais, mas são coisas que aprendi ao longo da minha experiência trabalhando em equipe e a partir do que leio pelos autores de "Código Limpo".

## 1- Uso de Traits
As Traits servem simplesmente para reuso de código, que pode nos auxiliar nos casos em que fatalmente precisamos cair no comportamento de “copiar e colar” determinados trechos de códigos em diferentes classes. Dessa forma, a primeira dica é criarmos traits para nossos relacionamentos, assim podemos aproveitar eles em diferentes Models. 

Eu gosto de criar elas em <em>**Models/Relations**</em>:
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s5nmgdc8zk4vil5fv5zm.png)
Este é um exemplo de uma trait para o relacionamento **BelongsToUser**: 
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pbtq1f6ubsq7bexxg2oe.png)
 
No exemplo, os models de **Address** e **Point** **possuem o mesmo relacionamento com o model de User**, é feito apenas a chamada da trait **BelongsToUser** no início da classe sem precisar ficar reescrevendo o código do relacionamento: 
<table>
  <tr>
    <td style="border:none"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n2q86o0m1pfwx3of0nme.png" width="200" /></td>
    <td style="border:none"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t60r0b3mky11ljtn3f9k.png" width="200" /></td>
  </tr>
 </table>

## 2 - View Composer 
Um recurso muito bacana do framework que gosto de utilizar é o uso de View Composer, nele simplesmente centralizamos as variáveis de cada view quando ela é renderizada sem precisar ficar passando os parâmetros pelo controller. Então, independente do lugar que chame aquela view, você não precisa ficar se preocupando com as variáveis que ela precisa receber. Veja o exemplo do meu **UserViewComposer**
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rzus7annjx5fj1hja7mn.png)

Eu tenho um ServiceProvider chamado **ViewServiceProvider** que é onde define em quais views aquelas variáveis (roles e users) devem aparecer quando forem renderizadas. 
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gnlyrvv5hx85booyuycu.png)
Veja que sempre que forem chamada as views: <em>'pages.users.index', 'pages.users.create' e 'pages.users.edit'</em> essas variáveis definidas no **UserViewComposer** estarão disponíveis, assim não precisamos nos preocupar em ficar passando elas pelo o controller! Sem falar que ocorre das vezes acabamos esquecendo de alguma :sweat_smile:

## 3 - Separe a regra de negócio
Crie métodos no seu model para isolar a lógica de negócio. Seus controladores devem ser simples. Eles precisam dizer coisas como "criar fatura do pedido". Eles não devem se preocupar com os detalhes de como seu banco de dados está estruturado. Deixe isso para o modelo.
<table>
<tr><td>:x:</td> <td>:white_check_mark:</td></tr>
  <tr>
    <td style="border:none"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aagedp7ezeapp6kv6szs.png" width="200" />
</td>
    <td style="border:none"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zc30096ctr48sbnhcnp2.png" width="200" /></td>
  </tr>
 </table>

## 4 - Form's Request's
Ao invés de usar o validate dentro do seu controler, escolha os Requests, porque além de isolar toda a lógica de validação do seu backend, ainda deixa o controller mais limpo. Veja um exemplo da validação com e sem o uso de Form Request. 

### Sem Form Request :x:
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/soxxyclyizu1civezz2l.png)
 
### Com Form Request :white_check_mark:
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/btf02z3uglt3zhiq5qdg.png)

Bem mais limpo né? Além disso, você pode até re-aproveitar a chamada das regras de validação e também fazer um esquema de "permissão" no authorize. Se curtiu essa dica, você pode da uma olhada na documentação oficial de como utilizar o [Form Request](https://laravel.com/docs/8.x/validation#form-request-validation)

## 5 - Uso de Helper Functions
Se existem trechos de códigos que estão repetidos, outro recurso que você pode utilizar são os helpers.É muito comum usarmos para formatação e conversão de texto, por exemplo. 
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wpl2gzz8mrjcox343m20.png)
A função "money" agora pode ser chamada em qualquer parte do projeto. 

E aí, você já sabia de todas? Essas foram só algumas sugestões que se aplicarmos no nosso dia a dia podem fazer muita diferença! Espero que tenham gostado, deixem mais dicas nos comentários :smiley: