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(2mo ago)020MITMakefilePHP &gt;=8.1

Since May 17Pushed 1mo 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 1mo ago

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

Best Practices – Architecture &amp; Conventions
===============================================

[](#best-practices--architecture--conventions)

Vue d'ensemble
--------------

[](#vue-densemble)

Ce dépôt centralise les bonnes pratiques d'architecture PHP pour les projets Laravel : découplage, immutabilité, typage fort, testabilité.

Sommaire des pratiques
----------------------

[](#sommaire-des-pratiques)

FichierSujet[INTERFACES.md](./practices/INTERFACES.md)Contrats (`Likeable`, `Likerable`)[REPOSITORIES.md](./practices/REPOSITORIES.md)Accès aux données, extends `AbstractRepository`[ENUMS.md](./practices/ENUMS.md)Backed enums (string), nom `{Model}{Field}`[LOGGING.md](./practices/LOGGING.md)Logs structurés JSONL (pas de facade)[SEEDING.md](./practices/SEEDING.md)Données réalistes, pas de factories[TESTS.md](./practices/TESTS.md)Pas de `final` sur les classes mockables[MODELS.md](./practices/MODELS.md)Aucune logique métier, uniquement déclarations[TASKS.md](./practices/TASKS.md)Actions asynchrones (fichiers JSON)[RECORDS.md](./practices/RECORDS.md)DTO internes, propriétés `snake_case`[SERVICES.md](./practices/SERVICES.md)Pas d'état interne, injection de dépendances[ABSTRACTS.md](./practices/ABSTRACTS.md)Classes abstraites, composition (pas de traits)[MIGRATIONS.md](./practices/MIGRATIONS.md)`string` pour enums (pas `->enum()`)[NORMALIZATION.md](./practices/NORMALIZATION.md)Normalisation récursive via `NormalizerChain`[DATA\_OBJECTS.md](./practices/DATA_OBJECTS.md)`StrictDataObject` pour Records, `DataObject` pour Data[ACTIONS.md](./practices/ACTIONS.md)Une route = une Action, retourne `ResponseFactory`[FORM\_REQUESTS.md](./practices/FORM_REQUESTS.md)`getRecord(): AbstractRecord` (jamais injecté dans l'Action)[ROUTING.md](./practices/ROUTING.md)`ActionRoute` pour lier Request → Action[MIDDLEWARES.md](./practices/MIDDLEWARES.md)Tâches transversales, pas de logique métier[CONFIGS.md](./practices/CONFIGS.md)Classes sans propriétés, méthodes typées[VALUE\_OBJECTS.md](./practices/VALUE_OBJECTS.md)Validation dans le constructeur, immutables[TYPED\_COLLECTIONS.md](./practices/TYPED_COLLECTIONS.md)Pas de `array` brut, toujours `TypedCollection`[HYDRATABLES.md](./practices/HYDRATABLES.md)Hydratation automatique via `from()` / `fromJson()`[CASTS.md](./practices/CASTS.md)Transformations pures DB ↔ Application[DIRECTIVES.md](./practices/DIRECTIVES.md)Commandes CLI, alias en `dot.case`[STRUCTURATION.md](./practices/STRUCTURATION.md)Mini-packages, injection obligatoire (pas de helpers)Règles d'or
-----------

[](#règles-dor)

- **Zéro helper** retournant une instance de classe
- **Zéro tableau brut** dans Records / Data / Value Objects
- **Zéro appel statique** métier (Log, Cache, DB…)
- **Zéro final** sur les classes à mocker (Services, Tasks, Repositories)
- **Toute injection** est explicite dans le constructeur
- **snake\_case** pour Records, **camelCase** pour Data et Value Objects

Utilisation rapide
------------------

[](#utilisation-rapide)

```
# Consulter une pratique
cat practices/INTERFACES.md

# Exemple de record (snake_case)
$user = UserRecord::from(['user_id' => 1, 'user_name' => 'John']);
```

Licence
-------

[](#licence)

Interne – non redistribuable.

###  Health Score

40

—

FairBetter than 86% of packages

Maintenance89

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

61d 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 (59 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.6M1.0k](/packages/statamic-cms)[code16/sharp

Laravel Content Management Framework

79164.7k9](/packages/code16-sharp)[emargareten/inertia-modal

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

90142.9k](/packages/emargareten-inertia-modal)[crumbls/layup

A visual page builder plugin for Filament 5 — Divi-style grid layouts with extensible widgets.

592.8k2](/packages/crumbls-layup)[nunomaduro/laravel-starter-kit-inertia-react

The skeleton application for the Laravel framework.

2071.1k](/packages/nunomaduro-laravel-starter-kit-inertia-react)

PHPackages © 2026

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