AbstractRepository
v1.1.0O AbstractRepository representa a camada de persistência do Laravel Domain Generator.
Em vez de espalhar consultas pelo Service ou Controller, toda comunicação com o banco é centralizada no Repository.
Todo Repository criado pelo php artisan make:domain estende automaticamente essa classe.
Visão Geral
Os Repositories gerados fornecem uma API reutilizável e previsível para operações de banco de dados.
Recursos disponíveis:
- CRUD completo
- Paginação
- Busca por identificadores públicos
- Eager loading
- Delegação para Query Builder
- Compatibilidade com SoftDeletes
- Filtros dinâmicos
- Ordenação
- Métodos reutilizáveis
Exemplo mínimo:
class UserRepository extends AbstractRepository
{
public function model(): string
{
return User::class;
}
}Ciclo do Repository
Toda operação segue o mesmo pipeline.
O Repository é responsável exclusivamente pela persistência, enquanto o Service permanece responsável pelas regras de negócio.
Propriedades protegidas
$model
protected Model $model;Armazena automaticamente a instância do Model resolvida pelo método model().
Método obrigatório
model()
public function model(): stringTodo Repository deve informar qual Model administra.
Exemplo:
public function model(): string
{
return User::class;
}Normalmente, esse é o único método obrigatório da implementação.
Métodos CRUD
create()
Cria um novo registro.
Exemplo:
$repository->create([
'nome' => 'João',
'email' => 'joao@email.com'
]);Fluxo:
Array
↓
Repository
↓
Model::create()
↓
BancoRetorna o Model criado.
update()
Atualiza um registro existente.
Exemplo:
$repository->update($user, [
'nome' => 'João Atualizado'
]);Fluxo:
- Resolve a entidade.
- Preenche atributos.
- Salva alterações.
delete()
Remove um registro.
Quando SoftDeletes está habilitado, a exclusão passa a ser lógica automaticamente.
restore()
Restaura registros removidos logicamente.
Exemplo:
$repository->restore($publicId);Muito útil para áreas administrativas.
Métodos de Busca
find()
Recupera uma entidade.
Exemplo:
$user = $repository->find($publicId);Retorna null quando não encontra.
findOrFail()
Lança exceção quando o registro não existe.
Exemplo:
$user = $repository->findOrFail($publicId);Mantém o comportamento familiar do Laravel, mas com suporte a identificadores públicos.
findByPublicId()
Um dos métodos mais importantes da biblioteca.
Em vez de expor IDs internos:
/api/users/15utiliza:
/api/users/01JXYZABCDEF123456Compatível com:
- ULID
- UUID
- UUID32
- hashes personalizados
Métodos de Coleção
all()
Retorna todos os registros.
Exemplo:
$repository->all();Recomendado apenas para conjuntos pequenos.
paginate()
Retorna resultados paginados.
Exemplo:
$repository->paginate(15);A resposta já inclui:
datalinksmeta
Métodos do Query Builder
O Repository oferece construção fluente de consultas.
with()
Carrega relacionamentos antecipadamente.
Exemplo:
$repository->with([
'municipio'
]);Equivalente a:
User::with('municipio');Benefícios:
- menos consultas;
- respostas previsíveis.
where()
Adiciona filtros simples.
Exemplo:
$repository->where('ativo', true);whereLike()
Realiza buscas parciais.
Exemplo:
$repository->whereLike('nome', 'João');Equivalente a:
WHERE nome LIKE '%João%'Ideal para pesquisas.
whereIn()
Filtra múltiplos valores.
Exemplo:
$repository->whereIn('perfil', [
'admin',
'manager'
]);orderBy()
Ordena resultados.
Exemplo:
$repository->orderBy('nome');Ordem decrescente:
$repository->orderBy('created_at', 'desc');Encadeamento de Consultas
Um dos maiores benefícios do Repository é o encadeamento fluente.
Exemplo:
$repository
->with(['municipio'])
->where('ativo', true)
->orderBy('nome')
->paginate();Legível, reutilizável e expressivo.
Carregamento de Relacionamentos
Os relacionamentos ficam centralizados.
Exemplo:
$repository->with([
'municipio',
'envios'
]);Sem necessidade de repetir consultas nos Services.
Fluxo da Paginação
A paginação segue sempre o mesmo pipeline.
Service
↓
Repository
↓
Query Builder
↓
Paginator
↓
Resource CollectionOs Controllers recebem uma estrutura padronizada automaticamente.
SoftDeletes
Os Repositories gerados possuem suporte completo ao SoftDeletes.
Exemplo:
use SoftDeletes;Operações disponíveis:
delete()restore()- consultas em registros removidos
forceDelete()(quando implementado)
Considerações de Performance
Prefira:
with()paginate()- filtros específicos
Evite:
- carregar relacionamentos desnecessários;
- utilizar
all()em tabelas muito grandes.
Boas Práticas
Mantenha o Repository responsável apenas pela persistência.
Recomendado:
- construir consultas;
- carregar relacionamentos;
- paginar;
- recuperar entidades.
Evite colocar regras de negócio aqui.
Elas pertencem ao Service.
Os Repositories gerados oferecem uma API consistente para persistência enquanto mantêm a lógica de negócio completamente separada do acesso ao banco de dados.