laymont / laravel-pattern-repository
Laravel package for implementing the Repository Pattern with Eloquent, Criteria, and Actions support
Package info
github.com/laymont/PatternRepositoryLaravel
pkg:composer/laymont/laravel-pattern-repository
Requires
- php: >=8.3
- illuminate/console: ^13.0
- illuminate/database: ^13.0
- illuminate/support: ^13.0
- laravel/framework: ^13.0
Requires (Dev)
- mockery/mockery: ^1.6
- orchestra/testbench: ^11.0
- pestphp/pest: ^3.0
- phpunit/phpunit: ^11.0
This package is auto-updated.
Last update: 2026-04-28 16:36:41 UTC
README
Este paquete de Laravel simplifica la implementación del patrón repositorio, ayudando a crear aplicaciones con una arquitectura limpia, mantenible y escalable.
¿Qué es el Patrón Repositorio?
El patrón repositorio actúa como una capa de abstracción entre la lógica de negocio y la capa de acceso a datos. Al usar repositorios, tus controladores y servicios interactúan con los datos a través de interfaces, sin necesidad de conocer la implementación concreta del acceso a datos (por ejemplo, consultas a la base de datos). Esto aporta múltiples ventajas:
- Desacoplamiento: Reduce la dependencia entre las diferentes capas de la aplicación.
- Facilidad de prueba: Permite realizar pruebas unitarias de la lógica de negocio sin necesidad de una base de datos real (usando mocks).
- Flexibilidad: Facilita el cambio de la implementación del acceso a datos (por ejemplo, cambiar de base de datos o usar un ORM diferente) sin afectar la lógica de negocio.
- Código organizado: Promueve un código más limpio, estructurado y fácil de mantener.
- Reutilización: Facilita la reutilización de la lógica de acceso a datos en diferentes partes de la aplicación.
Compatibilidad
- Laravel Framework:
^13.0 - PHP:
>=8.3
Instalación
Puedes instalar el paquete usando Composer:
composer require laymont/pattern-repository-laravel
El paquete se autodescubre, por lo que no es necesario registrar el ServiceProvider.
Estructura del Paquete
src/
├── Actions/
│ ├── CreateAction.php # Acción para crear registros
│ ├── UpdateAction.php # Acción para actualizar registros
│ └── DeleteAction.php # Acción para eliminar registros
├── Concerns/
│ ├── Cacheable.php # Trait para caché de consultas
│ ├── HasCriteria.php # Trait para patrón Criteria
│ └── HasEloquentScopes.php # Trait para global scopes
├── Contracts/
│ ├── RepositoryInterface.php # Interfaz base del repositorio
│ ├── ReadableRepositoryInterface.php # Interfaz solo lectura
│ ├── WritableRepositoryInterface.php # Interfaz solo escritura
│ └── CriteriaInterface.php # Interfaz para Criteria
├── Criteria/
│ ├── WhereEqualsCriteria.php # Criteria para WHERE campo = valor
│ └── SearchWhereLikeCriteria.php # Criteria para búsqueda LIKE
├── Repositories/
│ └── EloquentRepository.php # Repositorio base con Eloquent
└── Providers/
└── PatternRepositoryServiceProvider.php
Uso Rápido
1. Crear un Repositorio
use Laymont\PatternRepository\Repositories\EloquentRepository; use App\Models\User; class UserRepository extends EloquentRepository { public function __construct(User $model) { parent::__construct($model); } }
2. Usar el Repositorio
// Inyectar en controlador public function __construct( protected UserRepository $users ) {} // Obtener todos los usuarios $users = $this->users->all(); // Buscar por ID $user = $this->users->find($id); // Crear usuario $user = $this->users->create($data); // Actualizar usuario $this->users->update($id, $data); // Eliminar usuario $this->users->delete($id); // Paginar $users = $this->users->paginate(15);
Características Avanzadas
Patrón Criteria
use Laymont\PatternRepository\Criteria\WhereEqualsCriteria; $repository->pushCriteria(new WhereEqualsCriteria('active', true)); $users = $repository->all(); $repository->resetCriteria();
Caché de Consultas
$repository->enableCache(60); // Habilitar caché con TTL de 60 segundos $repository->disableCache(); // Deshabilitar caché // Los resultados se cachean automáticamente
Acciones Atómicas
use Laymont\PatternRepository\Actions\CreateAction; use App\Models\User; $action = app(CreateAction::class); $user = $action->execute(new User(), $data);
Scopes de Eloquent
$repository->withScopes(); // Aplicar todos los global scopes $repository->withoutScopes(); // Quitar todos los global scopes
Interfaces Separadas
ReadableRepositoryInterface
use Laymont\PatternRepository\Contracts\ReadableRepositoryInterface; interface UserReadRepository extends ReadableRepositoryInterface { public function findByEmail(string $email): ?User; }
WritableRepositoryInterface
use Laymont\PatternRepository\Contracts\WritableRepositoryInterface; interface UserWriteRepository extends WritableRepositoryInterface { public function firstOrCreate(array $data): User; public function updateOrCreate(array $search, array $data): User; }
Comandos Artisan
# Generar repositorio php artisan make:repository User # Generar con opciones php artisan make:repository User --abstract --criteria --interfaces=separate
Configuración
Publica el archivo de configuración:
php artisan vendor:publish --provider="Laymont\PatternRepository\Providers\PatternRepositoryServiceProvider"
Edita config/pattern-repository.php:
return [ 'namespace' => 'App\\Repositories', 'path' => app_path('Repositories'), 'enable_cache' => false, 'cache_ttl' => 60, 'pagination' => [ 'default_per_page' => 15, 'max_per_page' => 100, ], ];
Pruebas
El paquete incluye 39 tests con cobertura de:
- Actions (Create, Update, Delete)
- EloquentRepository
- Concerns (Cacheable, HasCriteria, HasEloquentScopes)
- Criteria (WhereEqualsCriteria)
- Contracts (todas las interfaces)
Ver TESTING.md para más detalles.
Actualizaciones de v4.0.0
- ✅ Soporte para Laravel 13
- ✅ Nuevo
EloquentRepositorybase con traits - ✅ Actions separadas para operaciones CRUD
- ✅ 39 tests automatizados con SQLite en memoria
- ✅ Contratos mejorados (RepositoryInterface, ReadableInterface, WritableInterface)
Para una guía detallada, consulta el archivo TESTING.md.
Contribución
- Haz un fork del repositorio.
- Crea una rama:
git checkout -b feature/nueva-funcionalidad. - Realiza cambios y hace commit:
git commit -m "Agregando...". - Sube:
git push origin feature/nueva-funcionalidad. - Abre un Pull Request.
Donaciones
Si encuentras útil este paquete y deseas apoyar su desarrollo y mantenimiento, puedes considerar hacer una donación.
Zinli
- ID de usuario: 3-002-58546608-36
- Recargar: https://recargas.zinli.com/4nVRQUniFdK8DBfPzzfyzR
Visa Prepagada Zinli
- Número: 4850460061276928
Binance Pay
- Binance Pay ID: 206414132
¡Gracias por tu apoyo!
Licencia
MIT License. Ver LICENSE para más detalles.