<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Luciano Charles de Souza</title>
    <description>The latest articles on DEV Community by Luciano Charles de Souza (@lucianocharlesdesouza).</description>
    <link>https://dev.to/lucianocharlesdesouza</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1444771%2F2022a55e-a548-4a6d-b9b0-d6a78dcf9f87.jpeg</url>
      <title>DEV Community: Luciano Charles de Souza</title>
      <link>https://dev.to/lucianocharlesdesouza</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lucianocharlesdesouza"/>
    <language>en</language>
    <item>
      <title>Repository Pattern no Laravel: Uma Análise Crítica</title>
      <dc:creator>Luciano Charles de Souza</dc:creator>
      <pubDate>Fri, 25 Jul 2025 16:30:38 +0000</pubDate>
      <link>https://dev.to/lucianocharlesdesouza/repository-pattern-no-laravel-uma-analise-critica-4klp</link>
      <guid>https://dev.to/lucianocharlesdesouza/repository-pattern-no-laravel-uma-analise-critica-4klp</guid>
      <description>&lt;p&gt;No ecossistema Laravel, uma das discussões mais recorrentes e controversas envolve o uso do &lt;strong&gt;Repository Pattern&lt;/strong&gt; com o &lt;strong&gt;Eloquent ORM&lt;/strong&gt;.&lt;br&gt;
Frequentemente, influenciados por tutoriais e cursos online, vemos desenvolvedores implementando este padrão como uma tentativa de alcançar uma arquitetura mais limpa e testável. &lt;/p&gt;

&lt;p&gt;Porém, será que essa abordagem realmente cumpre seu propósito dentro do contexto do Laravel, ou apenas aplica mais &lt;strong&gt;complexidade desnecessária&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Neste artigo, vamos fazer uma análise crítica sobre o uso do Repository Pattern em projetos Laravel, discutindo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Suas motivações reais&lt;/li&gt;
&lt;li&gt;Os benefícios e armadilhas comuns&lt;/li&gt;
&lt;li&gt;A relação entre Repository Pattern e Domain-Driven Design (DDD)&lt;/li&gt;
&lt;li&gt;Quando essa abordagem faz (ou não faz) sentido&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Qual é a motivação para usar Repository Pattern no Laravel?
&lt;/h2&gt;

&lt;p&gt;Muitos desenvolvedores implementam Repositories com o objetivo de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desacoplar a lógica de acesso a dados do restante da aplicação&lt;/li&gt;
&lt;li&gt;Facilitar a troca do ORM (por exemplo, substituir o Eloquent por outro mecanismo)&lt;/li&gt;
&lt;li&gt;Tornar a aplicação mais testável, principalmente utilizando mocks nos testes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Porém, existe um problema:&lt;/strong&gt; a maioria dessas implementações acaba sendo apenas um &lt;em&gt;wrapper&lt;/em&gt; em torno do próprio Eloquent.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Exemplo clássico de Repository simplista:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EloquentUserRepository&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;UserRepositoryInterface&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa camada, muitas vezes, não oferece nenhum valor real, já que apenas repassa os métodos do Eloquent sem adicionar regras de negócio ou abstrações relevantes.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é realmente um Repository de verdade?
&lt;/h2&gt;

&lt;p&gt;Segundo o DDD de Eric Evans, um Repository é:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Um mecanismo para encapsular o acesso a coleções de objetos de uma dada entidade de domínio, fornecendo uma interface que simula uma coleção em memória."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ou seja, um Repository &lt;strong&gt;não deveria conhecer a tecnologia usada para acessar os dados&lt;/strong&gt; (Eloquent, SQL puro, API externa, etc). Ele deve funcionar como um intermediário entre o domínio e as fontes de dados.&lt;/p&gt;

&lt;p&gt;Além disso, um Repository maduro &lt;strong&gt;não retorna Eloquent Models&lt;/strong&gt; diretamente. Ele retorna:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entidades do domínio (quando aplicável)&lt;/li&gt;
&lt;li&gt;Objetos de transferência de dados (DTOs)&lt;/li&gt;
&lt;li&gt;Coleções de objetos de negócio&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Mas o Laravel já é um Active Record… e isso importa!
&lt;/h2&gt;

&lt;p&gt;O Laravel utiliza o padrão &lt;strong&gt;Active Record&lt;/strong&gt; com o Eloquent, o que torna cada modelo responsável tanto por sua lógica de negócio quanto por seu acesso ao banco de dados.&lt;/p&gt;

&lt;p&gt;Por isso, tentar simular um repositório "puro" dentro do Laravel exige muito cuidado, pois:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Eloquent já mistura persistência com lógica de negócio&lt;/li&gt;
&lt;li&gt;Muitos desenvolvedores acabam apenas replicando métodos existentes do Eloquent&lt;/li&gt;
&lt;li&gt;O acoplamento com Eloquent continua existindo, mas agora em dois lugares: no Repository e no Model&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Ou seja: criar um Repository que só chama &lt;code&gt;User::find($id)&lt;/code&gt; &lt;strong&gt;não está tornando seu código mais limpo nem mais testável&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Um Repository útil dentro do Laravel
&lt;/h2&gt;

&lt;p&gt;Se mesmo assim você quiser utilizar Repository Pattern, procure seguir esta prática:&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Quando usar Repository faz sentido no Laravel
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Você está adotando DDD e precisa separar os conceitos de domínio do acesso a dados, então voce deixaria o Eloquent de lado e, passaria a usar o padrão de Data Mapper, como o que o Doctrine oferta.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Quando não usar
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Apenas por "boas práticas genéricas"&lt;/li&gt;
&lt;li&gt;Para fazer &lt;em&gt;pass-throughs&lt;/em&gt; simples do tipo &lt;code&gt;return User::all()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Para fingir que sua aplicação é mais abstrata do que realmente é&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Considerações finais
&lt;/h2&gt;

&lt;p&gt;O Repository Pattern pode ser uma ferramenta poderosa quando utilizada com propósito e conhecimento. Mas, no contexto do Laravel, é importante considerar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Eloquent já fornece uma API riquíssima, que muitas vezes dispensa a criação de Repositories&lt;/li&gt;
&lt;li&gt;Adicionar uma camada extra sem lógica de negócio só traz complexidade&lt;/li&gt;
&lt;li&gt;Usar Repository apenas para testes unitários pode ser um sinal de que o design precisa ser revisto&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Em vez de usar Repository Pattern por padrão, prefira:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Usar Service Layer com Eloquent Direto&lt;/li&gt;
&lt;li&gt;Criar Query Objects Pattern para Queries Complexas&lt;/li&gt;
&lt;li&gt;Criar Eloquent Scopes para Queries Reutilizáveis&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Se você estiver usando Repositories apenas para "ficar mais limpo" ou "porque ouvi dizer que é melhor", talvez seja hora de repensar. &lt;strong&gt;O Laravel já é poderoso o suficiente&lt;/strong&gt; para permitir código limpo e organizado(&lt;code&gt;se voce não bagunçar tudo&lt;/code&gt;) sem a necessidade de um Repository Pattern genérico.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;E você, tem usado Repository Pattern nos seus projetos Laravel? Tem alguma abordagem que resolveu esse impasse para você? Compartilha nos comentários!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>laravel</category>
      <category>architecture</category>
      <category>development</category>
    </item>
  </channel>
</rss>
