PHPackages                             laymont/laravel-pattern-repository - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. laymont/laravel-pattern-repository

ActiveLibrary[Database &amp; ORM](/categories/database)

laymont/laravel-pattern-repository
==================================

Paquete para generar repositorios en laravel

v3.0.0(6mo ago)01.0k[3 PRs](https://github.com/laymont/PatternRepositoryLaravel/pulls)MITPHPPHP &gt;=8.3CI passing

Since Dec 29Pushed 3mo ago1 watchersCompare

[ Source](https://github.com/laymont/PatternRepositoryLaravel)[ Packagist](https://packagist.org/packages/laymont/laravel-pattern-repository)[ RSS](/packages/laymont-laravel-pattern-repository/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (7)Dependencies (6)Versions (14)Used By (0)

Laravel Pattern Repository
==========================

[](#laravel-pattern-repository)

[![Latest Version on Packagist](https://camo.githubusercontent.com/21b14ed2c34a65235730944bae278ac2285f683cdc8f96f828e27cc87402011c/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6c61796d6f6e742f7061747465726e2d7265706f7369746f72792d6c61726176656c2e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/laymont/pattern-repository-laravel)[![Total Downloads](https://camo.githubusercontent.com/2d6230e2c010982fdb73605ecc0318a9414e72d9985d7a6306b5d875c59cdcad/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6c61796d6f6e742f7061747465726e2d7265706f7369746f72792d6c61726176656c2e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/laymont/pattern-repository-laravel)[![License: MIT](https://camo.githubusercontent.com/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667)](https://opensource.org/licenses/MIT)

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?
------------------------------

[](#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
--------------

[](#compatibilidad)

- **Laravel Framework:** `^12.0`
- **PHP:** `>=8.3`

Instalación
-----------

[](#instalación)

Puedes instalar el paquete usando Composer:

```
composer require laymont/laravel-pattern-repository
```

El paquete se autodescubre, por lo que no es necesario registrar el ServiceProvider.

### Que hace este paquete

[](#que-hace-este-paquete)

1. Crear una Interfaz de Repositorio Comienza definiendo una interfaz para tu repositorio en la carpeta app/Repositories/ (si no existe, crea la carpeta). Por ejemplo, para un repositorio de usuarios:

```
// app/Repositories/UserInterface.php
namespace App\Repositories\Interfaces;

use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;

interface UserInterface
{
    /**
    * Get all records.
    * @return Collection
    */
    public function getAll(): Collection;

    /**
    * Get all records with pagination.
    * @param Request $request
    */
    public function getAllPaginate(Request $request);

    /**
    * Find a record by its id.
    * @param int $id
    * @return Model
    */
    public function find(mixed $id): Model;

    /**
    * Create a new record.
    * @param array $attributes
    * @return Model
    */
    public function create(array $attributes): Model;

    /**
    * Update an existing record.
    * @param int $id
    * @param array $attributes
    * @return bool
    */
    public function update(int $id, array $attributes): bool;

    /**
    * Delete an existing record.
    * @param int $id
    * @return bool
    */
    public function delete(int $id): bool;
}
```

2. Crear una Implementación de Repositorio Luego, crea una clase que implemente la interfaz del repositorio en la carpeta app/Repositories/Eloquent/. Por ejemplo, para el repositorio de usuarios usando Eloquent:

```
// app/Repositories/UserRepository.php
namespace App\Repositories;

use Illuminate\Database\Eloquent\Collection;
use Laymont\PatternRepository\Exceptions\RepositoryException;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Models\User;
use App\Repositories\Interfaces\UserInterface;
use Illuminate\Support\Facades\Log;
use Throwable;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use Laymont\PatternRepository\Concerns\HandlePerPageTrait;

class UserRepository implements UserInterface
{
    use HandlePerPageTrait;

    public function __construct(protected User $model) {}

    /**
    * Get all records.
    * @return Collection
    */
    public function getAll(): Collection
    {
        return $this->model->all();
    }

    /**
    * Get all records with pagination.
    * @param Request $request
    * @return mixed
    */
    public function getAllPaginate(Request $request): mixed
    {
        return $this->model::paginate($this->getPerPage($request))->withQueryString();
    }

    /**
    * Find a record by its id.
    * @param int $id
    * @return Model
    */
    public function find(mixed $id): Model
    {
        return $this->model::query()->findOrFail($id);
    }

    /**
    * Create a new record.
    * @param array $attributes
    * @return Model
    * @throws RepositoryException
    */
    public function create(array $attributes): Model
    {
         try {
            return DB::transaction(function () use ($attributes) {
                return $this->model::create($attributes);
            });
        } catch (Throwable $e) {
            Log::error('Error al crear registro User ' , ['message' => $e->getMessage()]);
            throw new RepositoryException('Error al crear registro User', 0, $e);
        }
    }

    /**
    * Update an existing record.
    * @param int $id
    * @param array $attributes
    * @return bool
    * @throws RepositoryException
    */
    public function update(int $id, array $attributes): bool
    {
         try {
            return DB::transaction(function () use ($id, $attributes) {
                return $this->model::query()->where('id', $id)->update($attributes);
            });
        } catch (ModelNotFoundException $e) {
            throw new RepositoryException('Registro no encontrado.', 404, $e);
        }catch (Throwable $e) {
            Log::error( 'Error al actualizar el registro: ' . $e->getMessage());
            throw new RepositoryException('Error al actualizar el registro.', 0, $e);
        }
    }

    /**
    * Delete an existing record.
    * @param int $id
    * @return bool
    * @throws RepositoryException
    */
    public function delete(int $id): bool
    {
          try {
            return (bool) $this->model::destroy($id);
        } catch (ModelNotFoundException $e) {
            throw new RepositoryException('Registro no encontrado.', 404, $e);
        } catch (Throwable $exception) {
            Log::error('Error al eliminar el registro: '.$exception->getMessage());
            throw new RepositoryException('Error al eliminar el registro.', 0, $exception);
        }
    }
}
```

### Como se usa

[](#como-se-usa)

Luego de instalar el paquete desde la consola del proyecto ejecute por ejemplo

```
php artisan lay:repository User
```

Donde **User** representa el modelo al cual se le implementara el patron de repositorio, remplace el nombre del modelo por el nombre del modelo al cual planea implementarle el patron de repositorio. Como resultado se crearán dos archivos en app/Repositories

- app/Repositories/Interface/UserInterface.php
- app/Repositories/UserRepository.php

### El siguiente paso es registrar la implementación del patron de repositorio

[](#el-siguiente-paso-es-registrar-la-implementación-del-patron-de-repositorio)

Para registrar tu repositorio en el contenedor de dependencias de Laravel, debes usar un ServiceProvider. Puedes generar uno usando el comando de Artisan:

```
php artisan make:provider RepositoryServiceProvider
```

Luego actualiza el archivo generado app/Providers/RepositoryServiceProvider.php con lo siguiente:

```
