PHPackages                             andydefer/best-practices - 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. [Utility &amp; Helpers](/categories/utility)
4. /
5. andydefer/best-practices

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

andydefer/best-practices
========================

Architecture standardisée pour Laravel : Records typés, Actions découplées, Collections type-safe et tests robustes

6.0.0(2w ago)020MITPHPPHP &gt;=8.1

Since May 17Pushed 2w agoCompare

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

READMEChangelogDependencies (11)Versions (10)Used By (0)

Codebase Standards &amp; Best Practices
=======================================

[](#codebase-standards--best-practices)

📖 À propos
----------

[](#-à-propos)

Ce package contient la documentation exhaustive des conventions, bonnes pratiques et règles architecturales à suivre dans l'ensemble de la codebase. Ces documents définissent une architecture standardisée, rigoureuse et cohérente pour garantir la maintenabilité, la testabilité et l'évolutivité du code.

---

🎯 Objectifs
-----------

[](#-objectifs)

ObjectifDescription**Standardisation**Une seule façon de faire, partout, avec des règles strictes et immuables**Maintenabilité**Code prévisible, lisible et facile à modifier grâce à une séparation claire des responsabilités**Testabilité**Architecture découplée (Repositories, Services, Workers, Tasks) qui rend les tests unitaires et fonctionnels simples et robustes**Cohérence**Les mêmes patterns et conventions sont appliqués dans toute l'application, du contrôleur à la base de données---

📚 Documentation
---------------

[](#-documentation)

### Composants principaux

[](#composants-principaux)

DocumentDescription[practices/records.md](./practices/records.md)Structures typées pour la communication interne (Services, Repositories, Workers). **⚠️ Les tableaux bruts sont STRICTEMENT INTERDITS : utilisez `TypedRecords`**[practices/typed-records.md](./practices/typed-records.md)Collection type-safe qui remplace les tableaux bruts. Méthodes `map()`, `filter()`, `sum()`, `groupBy()`, assertions et collections utilitaires (`StringTypedRecords`, `IntTypedRecords`, `FloatTypedRecords`, `BoolTypedRecords`, `NumberTypedRecords`)[practices/datas.md](./practices/datas.md)DTOs purs et immutables pour les réponses API. **⚠️ Création UNIQUEMENT via `fromRecord()`**[practices/actions.md](./practices/actions.md)Composants dédiés à UNE SEULE route. **⚠️ Une Action ne reçoit JAMAIS une Request, elle reçoit un Record**[practices/services.md](./practices/services.md)Logique métier pure (calculs, validation) ou services techniques (cache, email). **⚠️ ZÉRO appel statique, TOUTES les dépendances injectées**[practices/workers.md](./practices/workers.md)Orchestration d'opérations complexes. **⚠️ ZÉRO transaction, ZÉRO retour de valeur**[practices/tasks.md](./practices/tasks.md)Actions de même nature (ex: multiples créations DB, logs, appels API). **⚠️ ZÉRO appel statique, TOUTES les dépendances injectées**[practices/logger.md](./practices/logger.md)Système de logs structurés en JSONL[practices/directives.md](./practices/directives.md)Système de commandes CLI découplé et testable### Accès aux données

[](#accès-aux-données)

DocumentDescription[practices/repositories.md](./practices/repositories.md)Interface unique d'accès aux données. **⚠️ Tests UNIQUEMENT en intégration (pas de tests unitaires). Les méthodes héritées d'`AbstractRepository` sont DÉJÀ testées par le package**[practices/models.md](./practices/models.md)Modèles anémiques (déclarations uniquement, aucune logique métier complexe)[practices/casts.md](./practices/casts.md)Casts personnalisés pour les attributs des modèles[practices/migrations.md](./practices/migrations.md)Structure des migrations et conventions de nommage[practices/seeders.md](./practices/seeders.md)Données réalistes sans factories Laravel### Couche HTTP

[](#couche-http)

DocumentDescription[practices/form-requests.md](./practices/form-requests.md)Validation dédiée à UNE SEULE route. **⚠️ DOIT étendre `AbstractRequest` et implémenter `toRecord()`**[practices/middlewares.md](./practices/middlewares.md)Tâches transversales techniques (auth, logs, CORS) sans logique métier[practices/routes.md](./practices/routes.md)Séparation stricte web/API. **⚠️ Les routes DOIVENT appeler `toRecord()` et passer un Record à l'Action**### Tests et qualité

[](#tests-et-qualité)

DocumentDescription[practices/tests.md](./practices/tests.md)Tests unitaires (sans DB) vs fonctionnels (avec DB). **⚠️ Actions = tests d'intégration uniquement, Repositories = tests d'intégration uniquement**[practices/interfaces.md](./practices/interfaces.md)Contrats explicites pour le découplage[practices/abstracts.md](./practices/abstracts.md)Classes de base pour l'infrastructure[practices/traits.md](./practices/traits.md)Réutilisation horizontale avec convention `Has{Entity}` + `{Entity}able`### Enums

[](#enums)

DocumentDescription[practices/enums.md](./practices/enums.md)Enums typés avec méthodes utilitaires (`values()`, `names()`, `isValid()`, `fromValue()`)---

🔑 Principes clés
----------------

[](#-principes-clés)

PrincipeRègle**Record → Data**Un Record ne doit JAMAIS être retourné en réponse API. Utiliser `UserData::fromRecord($record)`**Une Action = une route**Pas de réutilisation d'Action pour plusieurs routes**Type de retour unique**Une Action ne peut pas retourner `JsonResponse**Service ≠ Worker**Service = logique métier pure, Worker = orchestration d'effets de bord**Task = même nature**Une Task peut faire plusieurs actions, mais TOUTES de même nature**ZÉRO appel statique**`Log::`, `Mail::`, `Http::`, `Cache::`, `DB::` sont INTERDITS. TOUTES les dépendances DOIVENT être injectées**ZÉRO transaction dans Worker**Les transactions sont gérées par les Repositories ou les Services**Repository unique**Le seul point d'accès aux données. Pas de `User::find()` dans les Services**Model anémique**Pas de logique métier dans les Models (déplacer dans Enum, Service ou Task)**Form Request → toRecord()**Une Form Request DOIT implémenter `toRecord()` et l'Action reçoit le Record**TypedRecords**Les tableaux bruts (`array`) sont STRICTEMENT INTERDITS dans les Records. Utilisez `TypedRecords`**Tests**Actions et Repositories = tests d'intégration UNIQUEMENT. Services, Tasks, Workers = tests unitaires**Transactions**Repositories = transaction pour atomicité DB, Services = transaction pour atomicité métier, Workers = ZÉRO transaction---

**Version:** 3.0.0
**Mainteneur:** Andydefer
**Dernière mise à jour:** 2026-05-21

```

```

###  Health Score

42

—

FairBetter than 88% of packages

Maintenance97

Actively maintained with recent releases

Popularity9

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity48

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

9

Last Release

16d ago

Major Versions

1.0.1 → 2.0.02026-05-18

2.0.0 → 3.0.02026-05-21

3.0.2 → 4.0.02026-05-23

4.0.0 → 5.0.02026-05-23

5.0.0 → 6.0.02026-05-24

### Community

Maintainers

![](https://www.gravatar.com/avatar/2170ec3fbad9eb4b002661ab4f58b1cc374eae4293b92904c6a74bc2818bd570?d=identicon)[andydefer](/maintainers/andydefer)

---

Top Contributors

[![andydefer](https://avatars.githubusercontent.com/u/124321745?v=4)](https://github.com/andydefer "andydefer (48 commits)")

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan, Psalm, Rector

Code StyleLaravel Pint

Type Coverage Yes

### Embed Badge

![Health badge](/badges/andydefer-best-practices/health.svg)

```
[![Health](https://phpackages.com/badges/andydefer-best-practices/health.svg)](https://phpackages.com/packages/andydefer-best-practices)
```

###  Alternatives

[statamic/cms

The Statamic CMS Core Package

4.8k3.5M901](/packages/statamic-cms)[code16/sharp

Laravel Content Management Framework

78762.6k7](/packages/code16-sharp)[markwalet/nova-modal-response

A Laravel Nova asset for Modal responses on an action.

17818.7k](/packages/markwalet-nova-modal-response)[emargareten/inertia-modal

Inertia Modal is a Laravel package that lets you implement backend-driven modal dialogs for Inertia apps.

90128.1k](/packages/emargareten-inertia-modal)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
