PHPackages                             andydefer/laravel-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. andydefer/laravel-repository

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

andydefer/laravel-repository
============================

A lightweight, type-safe repository pattern implementation for Laravel

v2.9.2(4w ago)08011MITPHPPHP ^8.1

Since May 25Pushed 1mo agoCompare

[ Source](https://github.com/andydefer/laravel-repository)[ Packagist](https://packagist.org/packages/andydefer/laravel-repository)[ RSS](/packages/andydefer-laravel-repository/feed)WikiDiscussions main Synced 3w ago

READMEChangelogDependencies (12)Versions (25)Used By (11)

Laravel Repository
==================

[](#laravel-repository)

**Une implémentation légère et typée du pattern Repository pour Laravel avec intégration Records et Eloquent.**

[![Version PHP](https://camo.githubusercontent.com/83dd395020c37276225039739320f6c8e7e99963ab21ee3d09282cb48dad2a60/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e312532422d626c7565)](https://php.net)[![Version Laravel](https://camo.githubusercontent.com/ba69236eb9bfe25effcb7eb44086de41847364b41b47c2e3f6c3975cd2653974/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c61726176656c2d31322e7825323025374325323031332e7825323025374325323031342e7825323025374325323031352e782d626c7565)](https://laravel.com)[![Licence](https://camo.githubusercontent.com/bbd05f341c8cc2fef766a381c121830e990070db1c11179202f86be4fbfae318/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e63652d4d49542d677265656e)](LICENSE)

---

Table des matières
------------------

[](#table-des-matières)

1. [Installation](#installation)
2. [Concepts fondamentaux](#concepts-fondamentaux)
3. [Créer votre premier Repository](#cr%C3%A9er-votre-premier-repository)
4. [Référence de l'API](#r%C3%A9f%C3%A9rence-de-lapi)
5. [Méthodes à surcharger](#m%C3%A9thodes-%C3%A0-surcharger)
6. [Bonnes pratiques](#bonnes-pratiques)
7. [Exemple complet avec filtres complexes](#exemple-complet-avec-filtres-complexes)
8. [Tests](#tests)
9. [Génération de code avec Directive Forge](#g%C3%A9n%C3%A9ration-de-code-avec-directive-forge)
10. [Licence](#licence)

---

Installation
------------

[](#installation)

```
composer require andydefer/laravel-repository
```

### Prérequis

[](#prérequis)

- PHP 8.1 ou supérieur
- Laravel 12.x, 13.x, 14.x ou 15.x
- Dépendances automatiques :
    - `andydefer/php-records` (structures typées)
    - `laravel/framework`

### Publier la configuration (Optionnel)

[](#publier-la-configuration-optionnel)

```
php artisan vendor:publish --tag=repository-config
```

---

Concepts fondamentaux
---------------------

[](#concepts-fondamentaux)

### Le Record

[](#le-record)

Un Record est un DTO typé qui sert d'interface entre votre code et le Repository.

```
use AndyDefer\DomainStructures\Abstracts\AbstractRecord;

final class UserRecord extends AbstractRecord
{
    public function __construct(
        public readonly ?string $name = null,
        public readonly ?string $email = null,
        public readonly ?UserStatus $status = null,
    ) {}
}
```

**Règles pour les Records :**

- ✅ Étendre `AbstractRecord`
- ✅ Propriétés `public readonly`
- ✅ Les champs optionnels = `null` par défaut
- ❌ Pas de logique métier
- ❌ Pas de tableaux bruts (utiliser `TypedCollection`)

### Records de configuration

[](#records-de-configuration)

Le package fournit des Records standardisés pour les opérations :

#### FindByRecord

[](#findbyrecord)

```
use AndyDefer\Repository\Records\FindByRecord;

// Tri simple
$findBy = new FindByRecord(
    filters: new UserFiltersRecord(status: UserStatus::ACTIVE),
    limit: 10,
    sortBy: new SortColumns('name:asc'),
    columns: new SelectColumns(['id', 'name', 'email']),
);

// Tri multi-colonnes
$findBy = new FindByRecord(
    filters: new UserFiltersRecord(status: UserStatus::ACTIVE),
    limit: 10,
    sortBy: new SortColumns('name:asc|created_at:desc|id:asc'),
    columns: new SelectColumns(['id', 'name', 'email']),
);
```

PropriétéTypeDéfautDescription`filters``AbstractRecord``EmptyRecord`Filtres de recherche`limit``?int``null`Limite de résultats`sortBy``?SortColumns``null`Colonnes de tri (supporte le multi-colonnes)`columns``SelectColumns``SelectColumns::all()`Colonnes à sélectionner#### PaginateRecord

[](#paginaterecord)

```
use AndyDefer\Repository\Records\PaginateRecord;

$paginate = new PaginateRecord(
    perPage: 15,
    page: 1,
    sortBy: new SortColumns('created_at:desc'),
    filters: new UserFiltersRecord(status: UserStatus::ACTIVE),
    columns: new SelectColumns(['id', 'name', 'email']),
);

// Tri multi-colonnes sur plusieurs champs
$paginate = new PaginateRecord(
    perPage: 15,
    page: 1,
    sortBy: new SortColumns('category_id:asc|price:desc'),
    filters: new UserFiltersRecord(status: UserStatus::ACTIVE),
    columns: new SelectColumns(['id', 'name', 'email']),
);
```

PropriétéTypeDéfautDescription`perPage``int``15`Éléments par page`page``int``1`Numéro de page`sortBy``?SortColumns``null`Colonnes de tri (supporte le multi-colonnes)`filters``AbstractRecord``EmptyRecord`Filtres de recherche`columns``SelectColumns``SelectColumns::all()`Colonnes à sélectionner#### RepositoryInfoRecord

[](#repositoryinforecord)

```
use AndyDefer\Repository\Records\RepositoryInfoRecord;

$info = $repository->info();
// RepositoryInfoRecord {
//     modelClass: 'App\Models\User',
//     recordClass: 'App\Records\UserRecord',
// }
```

### Objet Valeur SortColumns

[](#objet-valeur-sortcolumns)

Le package fournit un Value Object pour gérer le tri simple ou multi-colonnes :

```
use AndyDefer\Repository\ValueObjects\SortColumns;

// Tri simple
$sort = new SortColumns('name:asc');
$sort->toArray();  // ['name' => 'asc']

// Tri multi-colonnes (syntaxe à barre verticale)
$sort = new SortColumns('name:asc|created_at:desc|id:asc');
$sort->toArray();  // ['name' => 'asc', 'created_at' => 'desc', 'id' => 'asc']

// Depuis un tableau associatif
$sort = SortColumns::fromArray(['name' => 'asc', 'created_at' => 'desc']);

// Vérifications
$sort->hasColumn('name');     // true
$sort->getDirection('name');  // 'asc'
$sort->count();               // 3
```

**Format de chaîne :** `colonne:direction|colonne:direction`

- `direction` peut être `asc` ou `desc`
- Les colonnes sont séparées par le caractère `|` (pipe)

### Objet Valeur SelectColumns

[](#objet-valeur-selectcolumns)

```
use AndyDefer\Repository\ValueObjects\SelectColumns;

// Créer avec des colonnes spécifiques
$columns = new SelectColumns(['id', 'name', 'email']);

// Sélectionner toutes les colonnes
$allColumns = SelectColumns::all();

// Ajouter des colonnes (retourne une nouvelle instance)
$extended = $columns->add('created_at', 'updated_at');

// Vérifier si une colonne existe
if ($columns->has('email')) {
    // ...
}

// Obtenir le nombre
$count = $columns->count();  // 3

// Convertir en tableau
$array = $columns->toArray();  // ['id', 'name', 'email']
```

---

Créer votre premier Repository
------------------------------

[](#créer-votre-premier-repository)

### 1. Créer le Modèle

[](#1-créer-le-modèle)

```
