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

1.2.1(2w ago)05↓100%MITPHPPHP ^8.1

Since May 25Pushed 1w 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 1w ago

READMEChangelogDependencies (6)Versions (5)Used By (0)

Voici la traduction complète du document en français :

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)

---

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;

$findBy = new FindByRecord(
    filters: new UserFiltersRecord(status: UserStatus::ACTIVE),
    limit: 10,
    sortBy: 'name',
    sortDir: SortDirection::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``?string``null`Champ de tri`sortDir``SortDirection``SortDirection::ASC`Direction du tri`columns``SelectColumns``SelectColumns::all()`Colonnes à sélectionner#### PaginateRecord

[](#paginaterecord)

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

$paginate = new PaginateRecord(
    perPage: 15,
    page: 1,
    sortBy: 'name',
    sortDir: SortDirection::ASC,
    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``?string``null`Champ de tri`sortDir``SortDirection``SortDirection::ASC`Direction du tri`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',
// }
```

### Énumération SortDirection

[](#énumération-sortdirection)

```
use AndyDefer\Repository\Enums\SortDirection;

$direction = SortDirection::ASC;

$direction->isAsc();     // true
$direction->isDesc();    // false
$direction->opposite();  // SortDirection::DESC
$direction->toSql();     // 'asc'
```

### 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)

```
