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 (!$request->email) {
return response()->json([‘error’ => ‘Email obrigatório’], 422);
}
$user = User::create([
'name' => $request->name,
'email' => $request->email,
]);
Mail::to($user->email)->send(new WelcomeMail($user));
Log::info('Usuário criado', ['id' => $user->id]);
return response()->json($user); }
Funciona? Funciona.
É bom? Não.
Por quê?
Isso acopla tudo.
Controller não decide regra.
Controller orquestra.
Vamos refatorar com um Service + DTO, padrão simples e poderoso.
Isso evita Request sendo usado como regra de negócio.
final class CreateUserDTO
{
public function __construct(
public readonly string $name,
public readonly string $email,
) {}
}
Simples, explícito e tipado.
final class CreateUserService
{
public function execute(CreateUserDTO $dto): User
{
if (!filter_var($dto->email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException('Email inválido');
}
$user = User::create([
'name' => $dto->name,
'email' => $dto->email,
]);
Mail::to($user->email)->send(new WelcomeMail($user));
Log::info('Usuário criado', ['id' => $user->id]);
return $user;
}
}
Agora sim:
public function store(Request $request, CreateUserService $service)
{
$dto = new CreateUserDTO(
name: $request->name,
email: $request->email
);
$user = $service->execute($dto);
return response()->json($user);
}
O controller:
Nada além disso.
Agora você testa a regra sem framework:
public function test_user_creation()
{
$service = new CreateUserService();
$dto = new CreateUserDTO(
name: 'Leo',
email: 'leo@email.com'
);
$user = $service->execute($dto);
$this->assertEquals('Leo', $user->name);
}
Sem Request.
Sem Controller.
Sem gambiarra.
Amanhã você precisa:
Você altera um lugar só.
” Código que funciona não é código bom.mCódigo bom é o que aguenta mudança.”
Pleno/sênior pensa assim:
Esse tipo de abordagem não aparece em tutorial de YouTube, mas é exatamente o que mantém sistemas vivos em produção.
Você não precisa ser especialista nem passar horas auditando código para saber se um projeto…
WordPress não é lento, frágil ou amador. Ele só ficou mal-falado porque virou refém de…
De assistentes que escrevem códigos a geradores de vídeos e músicas em segundos, essas inteligências…
WhatsApp é um canal excelente para alerta porque ele tem uma característica que e-mail e…
Durante alguns anos, o AMP foi tratado como solução quase obrigatória para quem queria desempenho…
Performance, acessibilidade e boas práticas deixaram de ser “detalhes técnicos” e passaram a impactar diretamente…