PHPackages                             andydefer/php-services - 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/php-services

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

andydefer/php-services
======================

Collection of reusable services for PHP and Laravel applications including model transformation, caching, and common business logic

v1.5.2(1w ago)0331↑662.5%5MITPHPPHP ^8.2

Since Jun 6Pushed 1w agoCompare

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

READMEChangelogDependencies (44)Versions (36)Used By (5)

PHP Services
============

[](#php-services)

[![PHP Version](https://camo.githubusercontent.com/187240af044d09d5b14a1d9d9ebdf3f7a993e4c7bc09bdb46b4ba661a891bf5b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e322532422d626c7565)](https://php.net)[![Laravel Version](https://camo.githubusercontent.com/9f235d3913901c94bd05e1d65afc2e43d1cc4627057f5d36e9c10bbafaa40bb1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c61726176656c2d3130253246313125324631322532463133253246313425324631352d6666326432302e737667)](https://laravel.com)[![License](https://camo.githubusercontent.com/5caa455d8debc46fb23abbadb45a733a937f3910a73fc875c2f7820468e1bb54/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d677265656e)](LICENSE)

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

[](#installation)

```
composer require andydefer/php-services
```

Philosophie du package
----------------------

[](#philosophie-du-package)

Ce package est une collection de services réutilisables pour PHP et Laravel.

Il s'inspire de plusieurs principes du génie logiciel qui servent de **boussole**, pas de **carcan** :

PrincipeCe qu'il encourageCe qu'il n'impose pas**Composition Over Inheritance**Préférer l'injection de dépendances à l'héritageL'héritage reste possible quand il est pertinent**Dependency Inversion**Dépendre des interfaces plutôt que des classes concrètesLes DTOs et Value Objects peuvent être concrets**Capability-Based Design**Exposer des capacités spécifiques plutôt que des services fourre-toutUn service peut avoir plusieurs méthodes cohésives**Domain-Driven Design**Organiser le code par domaine fonctionnelLa structure peut évoluer librementL'objectif est d'obtenir un code **testable**, **découplé** et **maintenable**, sans tomber dans l'extrémisme architectural.

---

Ce qu'un Service est
--------------------

[](#ce-quun-service-est)

```
// ✅ Un service = un conteneur de méthodes qui partagent un même domaine
class OrderCalculatorService
{
    // ✅ Des dépendances injectées dans le constructeur
    public function __construct(
        private readonly TaxService $taxService,
        private readonly OrderConfig $config,
    ) {}

    // ✅ Des méthodes qui reçoivent leurs données en paramètres
    public function calculateTotal(OrderRecord $order): float
    {
        $subtotal = $this->calculateSubtotal($order);
        $tax = $this->taxService->calculate($subtotal);

        return $subtotal + $tax;
    }

    // ✅ Pas d'état interne, pas de mémoire entre les appels
    private function calculateSubtotal(OrderRecord $order): float
    {
        return array_reduce($order->items, fn($c, $i) => $c + ($i->price * $i->quantity), 0);
    }
}
```

---

Pourquoi cette philosophie ?
----------------------------

[](#pourquoi-cette-philosophie-)

### Problème : Les traits (anti-pattern)

[](#problème--les-traits-anti-pattern)

```
// ❌ Un trait : impossible à tester isolément
trait FileCreator
{
    private Filesystem $files;

    public function createFile(string $path, string $content): bool
    {
        $this->files = new Filesystem();  // Dépendance cachée
        return $this->files->put($path, $content);
    }
}

class TaskDirective extends AbstractDirective
{
    use FileCreator;  // ❌ Couplage implicite, test impossible
}
```

### Solution : Le service

[](#solution--le-service)

```
// ✅ Un service : testable, injectable, découplé
class FileCreatorService
{
    public function __construct(
        private readonly Filesystem $files,  // ✅ Injection explicite
    ) {}

    public function createFile(string $path, string $content): bool
    {
        return $this->files->put($path, $content);
    }
}

class TaskDirective extends AbstractDirective
{
    public function __construct(
        private readonly FileCreatorService $fileCreator,  // ✅ Dépendance claire
    ) {}
}
```

---

Exemple complet : La testabilité en action
------------------------------------------

[](#exemple-complet--la-testabilité-en-action)

```
// Le service
class UserService
{
    public function __construct(
        private readonly UserRepository $repository,
        private readonly LoggerInterface $logger,
    ) {}

    public function findActiveUser(int $id): ?User
    {
        $this->logger->info('Searching for active user', ['id' => $id]);

        $user = $this->repository->findActive($id);

        if (!$user) {
            $this->logger->warning('Active user not found', ['id' => $id]);
            return null;
        }

        return $user;
    }
}

// Le test
class UserServiceTest extends TestCase
{
    public function test_findActiveUser_returns_user_when_exists(): void
    {
        // ✅ Toutes les dépendances sont mockables
        $repository = $this->createMock(UserRepository::class);
        $repository->method('findActive')->willReturn($user);

        $logger = $this->createMock(LoggerInterface::class);
        $logger->expects($this->once())->method('info');

        $service = new UserService($repository, $logger);
        $result = $service->findActiveUser(1);

        $this->assertSame($user, $result);

        // ✅ Aucune base de données réelle
        // ✅ Aucun fichier log réel
        // ✅ Test rapide, isolé, fiable
    }
}
```

---

Quand déroger aux principes ?
-----------------------------

[](#quand-déroger-aux-principes-)

La philosophie de ce package est **pragmatique** :

RèglePeut-on déroger ?ExemplePas d'état interne⚠️ Exception rareCache interne avec TTL courtPas de `final`✅ OuiClasse utilitaire sans dépendancesDépendre des interfaces✅ OuiValue Objects, DTOs, ConfigsUne capacité par service✅ Oui`OrderCalculatorService` a 5 méthodes liées**Le critère ultime** : Est-ce que mon code reste **testable** ?

---

Services disponibles
--------------------

[](#services-disponibles)

ServiceDescription`ModelTransformableService`Convertit les modèles Eloquent en Data DTOs typés[Voir la documentation complète](docs/api-references/SERVICES.md)

License
-------

[](#license)

MIT © [Andy Defer](https://github.com/andydefer)

###  Health Score

49

—

FairBetter than 94% of packages

Maintenance98

Actively maintained with recent releases

Popularity17

Limited adoption so far

Community13

Small or concentrated contributor base

Maturity58

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

35

Last Release

13d ago

Major Versions

v0.5.0 → 1.0.02026-06-15

v0.8.0 → v1.1.02026-06-17

### 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 (34 commits)")

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan, Psalm, Rector

Code StyleLaravel Pint

Type Coverage Yes

### Embed Badge

![Health badge](/badges/andydefer-php-services/health.svg)

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

###  Alternatives

[markwalet/nova-modal-response

A Laravel Nova asset for Modal responses on an action.

17878.9k](/packages/markwalet-nova-modal-response)[crumbls/layup

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

592.8k2](/packages/crumbls-layup)[duncanmcclean/statamic-cargo

Comprehensive e-commerce addon for Statamic. Build bespoke e-commerce sites without the complexity.

3518.3k](/packages/duncanmcclean-statamic-cargo)[tomshaw/electricgrid

A feature-rich Livewire package designed for projects that require dynamic, interactive data tables.

119.4k](/packages/tomshaw-electricgrid)

PHPackages © 2026

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