Trabalhar com Laravel em projetos pequenos é simples. Mas conforme o sistema cresce — mais desenvolvedores, mais regras de negócio, mais integrações — a estrutura padrão começa a dar sinais de que precisa evoluir. Neste artigo compartilho as práticas que adotei ao longo de anos trabalhando em projetos Laravel de médio e grande porte.

1. Separe a lógica de negócio dos Controllers

Um dos erros mais comuns em projetos Laravel é colocar toda a lógica no controller. Controllers devem ser finos: receber a requisição, delegar para um serviço e retornar a resposta.

A Service Layer resolve isso. Crie uma pasta app/Services e mova toda a lógica de negócio para lá:

// app/Services/UserService.php
class UserService
{
    public function __construct(
        private UserRepository $users,
        private MailService $mail
    ) {}

    public function register(array $data): User
    {
        $user = $this->users->create($data);
        $this->mail->sendWelcome($user);
        return $user;
    }
}

O controller fica limpo e testável:

// app/Http/Controllers/UserController.php
public function store(StoreUserRequest $request): JsonResponse
{
    $user = $this->userService->register($request->validated());
    return response()->json($user, 201);
}

2. Use Form Requests para toda validação

Validações inline no controller poluem o código e são difíceis de reusar. Form Requests encapsulam as regras de validação e autorização em uma classe dedicada.

php artisan make:request StoreUserRequest

Além das regras de validação, o método authorize() permite controlar quem pode fazer a requisição — evitando verificações espalhadas pelos controllers.

3. Repositories para abstrair o banco de dados

O padrão Repository cria uma camada entre a lógica de negócio e a persistência dos dados. Isso facilita testes (você pode mockar o repository) e permite trocar o mecanismo de persistência sem alterar os serviços.

Não use Repository em todo projeto. Em aplicações simples, o Eloquent direto na Service Layer é mais produtivo. Adote Repositories quando a complexidade justificar.

4. Eventos e Listeners para desacoplar efeitos colaterais

Toda vez que você se pega escrevendo código como "quando o usuário se cadastrar, enviar e-mail, criar log, notificar Slack...", está na hora de usar Events e Listeners. O sistema de eventos do Laravel permite que cada responsabilidade fique em sua própria classe, sem acoplar ao fluxo principal.

5. Organize por domínio, não por tipo de arquivo

A estrutura padrão do Laravel organiza por tipo: Controllers, Models, Jobs. Em projetos grandes, considere agrupar por domínio de negócio:

app/
  Billing/
    Controllers/
    Services/
    Models/
    Events/
  Auth/
    Controllers/
    Services/
  Catalog/
    ...

Isso torna o código mais navegável e facilita a separação de responsabilidades entre times.

Conclusão

Não existe bala de prata. Aplique estas práticas progressivamente conforme a complexidade crescer. O objetivo é manter o código legível, testável e fácil de evoluir — não adicionar camadas por adicionar.


Tem dúvidas ou sugestões? Me chame no WhatsApp ou no LinkedIn.