AbstractController
v1.1.0O AbstractController é a base de todos os Controllers gerados pela biblioteca.
Em vez de implementar manualmente CRUD, validação, conversão para DTO e respostas padronizadas, os Controllers herdam esse comportamento automaticamente.
Todo Controller criado por php artisan make:domain estende essa classe.
Visão Geral
Ao estender essa classe, o Controller recebe automaticamente:
- CRUD REST completo
- Validação automática via FormRequest
- Conversão automática para DTO
- Delegação para o Service
- Serialização via Resource
- Respostas JSON padronizadas
- Paginação automática
- Tratamento centralizado de exceções
- Relacionamentos via eager loading
Exemplo mínimo:
class UserController extends AbstractController
{
protected mixed $service;
protected ?string $requestValidate = UserRequest::class;
protected ?string $requestDto = UserDTO::class;
protected ?string $resource = UserResource::class;
public function __construct(UserService $service)
{
$this->service = $service;
}
}Fluxo interno
Todo request percorre sempre o mesmo pipeline.
Isso mantém a camada HTTP separada da lógica de negócio.
Propriedades protegidas
$service
protected mixed $service;Armazena a instância do Service injetada no construtor.
O Controller nunca conversa diretamente com o Model.
Fluxo:
Controller
↓
Service
↓
Repository
↓
Model$requestValidate
protected ?string $requestValidate;Define qual FormRequest valida o método store().
Exemplo:
protected ?string $requestValidate = UserRequest::class;Fluxo:
- Laravel valida o Request.
- Erros retornam HTTP 422.
- O payload validado é convertido em DTO.
$requestValidateUpdate
protected ?string $requestValidateUpdate;Define qual FormRequest será utilizado durante o update().
Permite regras diferentes para criação e atualização.
$requestDto
protected ?string $requestDto;Define qual DTO será criado automaticamente durante o store().
Internamente:
UserDTO::fromRequest($request);$requestDtoUpdate
Utilizado pelo update().
protected ?string $requestDtoUpdate = UserUpdateDTO::class;Mantém campos específicos de atualização isolados.
$resource
Define qual Resource será utilizado para serializar a resposta.
Exemplo:
protected ?string $resource = UserResource::class;Em vez de retornar Models diretamente:
return new UserResource($user);$with
protected array $with = [];Carrega relacionamentos automaticamente.
Exemplo:
protected array $with = [
'municipio'
];Equivalente a:
User::with('municipio');Métodos CRUD
index()
Retorna uma coleção paginada.
Fluxo:
Repository
↓
paginate()
↓
Resource::collection()show()
Busca um único registro utilizando identificadores públicos automaticamente.
Exemplo:
GET /api/users/01JXYZABCDEFstore()
Fluxo completo:
- Valida o Request.
- Cria o DTO.
- Executa o Service.
- Serializa o Resource.
- Retorna HTTP 201.
update()
Utiliza Request e DTO específicos para atualização.
Fluxo:
Request
↓
Update Request
↓
Update DTO
↓
Servicedestroy()
Remove o registro.
Quando o Model utiliza:
use SoftDeletes;o Controller executa Soft Delete automaticamente.
Conversão automática para DTO
Em vez de utilizar:
$request->validated();o Controller executa:
UserDTO::fromRequest($request);Benefícios:
- tipagem forte;
- payload imutável;
- Services mais limpos.
Resources automáticos
Os Controllers nunca retornam Models diretamente.
Em vez disso:
return new UserResource($user);Vantagens:
- oculta IDs internos;
- padroniza respostas;
- facilita integração com frontend.
Paginação
A paginação é automática.
Exemplo:
$this->service->paginate();A resposta já contém:
datalinksmeta
Sem necessidade de código adicional.
Tratamento de exceções
As exceções são normalizadas.
Exemplo:
{
"type": "error",
"status": 404,
"message": "Recurso não encontrado."
}Resposta de sucesso
Todas as operações bem-sucedidas seguem o mesmo padrão.
{
"type": "success",
"status": 200,
"data": {}
}Resposta de erro
Validação:
{
"type": "error",
"status": 422
}Autenticação:
{
"type": "error",
"status": 401
}Recurso inexistente:
{
"type": "error",
"status": 404
}Permissões
A autorização pode ser personalizada sobrescrevendo os métodos gerados.
Exemplo:
public function update(...)
{
$this->authorize('update', $user);
return parent::update(...);
}Mantém compatibilidade total com Laravel Policies.
Boas práticas
- Mantenha Controllers enxutos.
- Coloque regras de negócio no Service.
- Receba DTOs em vez de Requests.
- Retorne Resources em vez de Models.
- Utilize identificadores públicos nas APIs.
Os Controllers gerados seguem a arquitetura em camadas do Laravel Domain Generator, separando completamente HTTP da lógica de negócio e eliminando código repetitivo.