<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>php avançado Archives - Leonardo Nascimento | Engenheiro de Software</title>
	<atom:link href="https://leonardonascimento.dev/tag/php-avancado/feed/" rel="self" type="application/rss+xml" />
	<link>https://leonardonascimento.dev/tag/php-avancado/</link>
	<description>Especializado em backend, APIs e sistemas escaláveis. Experiência em arquitetura de sistemas, integrações, mensageria, performance e aplicações de alta disponibilidade.</description>
	<lastBuildDate>Fri, 23 Jan 2026 21:17:07 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://leonardonascimento.dev/wp-content/uploads/2021/05/cropped-programming-32x32.png</url>
	<title>php avançado Archives - Leonardo Nascimento | Engenheiro de Software</title>
	<link>https://leonardonascimento.dev/tag/php-avancado/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>PHP além do CRUD: como escrever código que não vira problema em produção</title>
		<link>https://leonardonascimento.dev/blog/php-alem-do-crud-como-escrever-codigo-que-nao-vira-problema-em-producao/</link>
					<comments>https://leonardonascimento.dev/blog/php-alem-do-crud-como-escrever-codigo-que-nao-vira-problema-em-producao/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Mon, 26 Jan 2026 11:05:00 +0000</pubDate>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[arquitetura de software]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[boas práticas]]></category>
		<category><![CDATA[código limpo]]></category>
		<category><![CDATA[dto]]></category>
		<category><![CDATA[engenharia de software]]></category>
		<category><![CDATA[php avançado]]></category>
		<category><![CDATA[services layer]]></category>
		<category><![CDATA[sistemas em produção]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2348</guid>

					<description><![CDATA[<p>A maioria dos desenvolvedores PHP sabe fazer CRUD.Isso não te torna pleno. Muito menos sênior. O que diferencia um dev mais experiente não é o que ele sabe fazer, mas o que ele evita fazer. Vou te ensinar aqui um padrão prático, usado em projetos reais, que resolve três problemas clássicos: public function store(Request $request){if [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/php-alem-do-crud-como-escrever-codigo-que-nao-vira-problema-em-producao/">PHP além do CRUD: como escrever código que não vira problema em produção</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>A maioria dos desenvolvedores PHP sabe fazer CRUD.<br>Isso não te torna pleno. Muito menos sênior.</p>



<p>O que diferencia um dev mais experiente não é <em>o que ele sabe fazer</em>, mas <strong>o que ele evita fazer</strong>.</p>



<p>Vou te ensinar aqui <strong>um padrão prático</strong>, usado em projetos reais, que resolve três problemas clássicos:</p>



<ul class="wp-block-list">
<li>Controllers inchados</li>



<li>Regras de negócio espalhadas</li>



<li>Código impossível de testar ou evoluir</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>public function store(Request $request)<br>{<br>if (!$request-&gt;email) {<br>return response()-&gt;json([&#8216;error&#8217; =&gt; &#8216;Email obrigatório&#8217;], 422);<br>}</p>



<pre class="wp-block-code"><code>$user = User::create(&#91;
    'name' =&gt; $request-&gt;name,
    'email' =&gt; $request-&gt;email,
]);

Mail::to($user-&gt;email)-&gt;send(new WelcomeMail($user));

Log::info('Usuário criado', &#91;'id' =&gt; $user-&gt;id]);

return response()-&gt;json($user);</code></pre>



<p>}</p>



<p>Funciona? Funciona.</p>



<p>É bom? Não.</p>



<p>Por quê?</p>



<ul class="wp-block-list">
<li>Controller decide regra de negócio</li>



<li>Controller cria usuário</li>



<li>Controller dispara e-mail</li>



<li>Controller registra log</li>
</ul>



<p>Isso <strong>acopla tudo</strong>.</p>



<h2 class="wp-block-heading" id="h-pensamento-pleno-senior-separar-responsabilidade">Pensamento pleno/sênior: separar responsabilidade</h2>



<p>Controller <strong>não decide regra</strong>.<br>Controller <strong>orquestra</strong>.</p>



<p>Vamos refatorar com um <strong>Service + DTO</strong>, padrão simples e poderoso.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-criando-um-dto-data-transfer-object">Criando um DTO (Data Transfer Object)</h2>



<p>Isso evita Request sendo usado como regra de negócio.</p>



<pre class="wp-block-code"><code>final class CreateUserDTO
{
    public function __construct(
        public readonly string $name,
        public readonly string $email,
    ) {}
}
</code></pre>



<p>Simples, explícito e tipado.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-criando-o-service-onde-a-regra-mora"> Criando o Service (onde a regra mora)</h2>



<pre class="wp-block-code"><code>final class CreateUserService
{
    public function execute(CreateUserDTO $dto): User
    {
        if (!filter_var($dto-&gt;email, FILTER_VALIDATE_EMAIL)) {
            throw new InvalidArgumentException('Email inválido');
        }

        $user = User::create(&#91;
            'name' =&gt; $dto-&gt;name,
            'email' =&gt; $dto-&gt;email,
        ]);

        Mail::to($user-&gt;email)-&gt;send(new WelcomeMail($user));

        Log::info('Usuário criado', &#91;'id' =&gt; $user-&gt;id]);

        return $user;
    }
}
</code></pre>



<p>Agora sim:</p>



<ul class="wp-block-list">
<li>Regra centralizada</li>



<li>Código reutilizável</li>



<li>Fácil de testar</li>



<li>Fácil de evoluir</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-controller-limpo-como-deveria-ser"> Controller limpo (como deveria ser)</h2>



<pre class="wp-block-code"><code>public function store(Request $request, CreateUserService $service)
{
    $dto = new CreateUserDTO(
        name: $request-&gt;name,
        email: $request-&gt;email
    );

    $user = $service-&gt;execute($dto);

    return response()-&gt;json($user);
}
</code></pre>



<p>O controller:</p>



<ul class="wp-block-list">
<li>Recebe request</li>



<li>Constrói DTO</li>



<li>Chama serviço</li>



<li>Retorna resposta</li>
</ul>



<p>Nada além disso.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O ganho real (que júnior não enxerga)</h2>



<h3 class="wp-block-heading" id="h-testabilidade">Testabilidade</h3>



<p>Agora você testa a regra <strong>sem framework</strong>:</p>



<pre class="wp-block-code"><code>public function test_user_creation()
{
    $service = new CreateUserService();

    $dto = new CreateUserDTO(
        name: 'Leo',
        email: 'leo@email.com'
    );

    $user = $service-&gt;execute($dto);

    $this-&gt;assertEquals('Leo', $user-&gt;name);
}
</code></pre>



<p>Sem Request.<br>Sem Controller.<br>Sem gambiarra.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="h-evolucao-sem-dor"> Evolução sem dor</h3>



<p>Amanhã você precisa:</p>



<ul class="wp-block-list">
<li>Enviar evento para fila</li>



<li>Criar usuário em sistema externo</li>



<li>Validar regra nova</li>
</ul>



<p>Você altera <strong>um lugar só</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Mentalidade sênior (isso vale ouro)</h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>&#8221; Código que funciona não é código bom.mCódigo bom é o que aguenta mudança.&#8221; </p>
</blockquote>



<p>Pleno/sênior pensa assim:</p>



<ul class="wp-block-list">
<li>Onde essa regra deve morar?</li>



<li>O que vai mudar daqui 6 meses?</li>



<li>Quem vai dar manutenção nisso?</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Erros clássicos que isso evita</h2>



<ul class="wp-block-list">
<li>Fat models</li>



<li>Controllers gigantes</li>



<li>Services que viram controllers</li>



<li>Regra duplicada</li>



<li>Código impossível de refatorar</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Esse tipo de abordagem <strong>não aparece em tutorial de YouTube</strong>, mas é exatamente o que mantém sistemas vivos em produção.</p>
<p>The post <a href="https://leonardonascimento.dev/blog/php-alem-do-crud-como-escrever-codigo-que-nao-vira-problema-em-producao/">PHP além do CRUD: como escrever código que não vira problema em produção</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/php-alem-do-crud-como-escrever-codigo-que-nao-vira-problema-em-producao/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
