Bonjour a tous,

J'aimerais avoir votre avis sur la question suivantes :

J'ai pris l'habitude de ne plus passer directement par eloquent pour gérer mes ecriture/lecture de la bdd dans les controleur, mais par le couple Contract/Repositories.

Mon souci est le suivant, c'est une question un peu méta.
Mais j'aimerais que l'input de mon repositories soit typé et m'oblige moi ou l'IDE ou un futur developpeur sur le projet a ne pas rentré n'importe quoi dans la méthode.

Exemple :

Voici quelque chose de normal, on demande un array et ensuite on fait notre t'embouille sur l'intégration concrête de l'interface. On appel eloquent et cie.

<?php

namespace App\Contracts\Repositories;

use App\Models\Stand;

interface StandRepositoryContract
{
    public function create(array $data):Stand;
    public function update(Stand $stand, array $data):Stand;

}

Je pourrais aussi faire ça :

<?php

namespace App\Contracts\Repositories;

use App\Models\Stand;

interface StandRepositoryContract
{
    public function create(string $name, string $description = ''):Stand;
    public function update(Stand $stand, string $name, string $description = ''):Stand;

}

Mais c'est plus difficile a faire évoluer si j'amais je rajoute un champ par exemple dans le stand, je dois refaire toutes les signatures de l'interface et de la ou des intégration concrète.

Voila je ne sais pas trop comment faire pour faire un système assez souple qu'un tableau, mais un peu moins permissif et surtout avoir une validation static du code avant même de l'executé. De plus l'IDE doit le comprendre et accompagner a l'utilisation du repository.

L'idée que j'ai serait de créer un entity qui encapsule les data possible que le repositories attend exemple :

<?php

namespace App\Entities;

final class StandEntity
{
      private string $name = '';
      private string $descritpion = '';

     public function __construct(){}    

     public static function hydrate(array $data):StandEntity
     {...}

     public function validate(){...}

}
<?php

namespace App\Contracts\Repositories;

use App\Models\Stand;

interface StandRepositoryContract
{
    public function create(StandEntity $entity):Stand;
    public function update(Stand $stand, StandEntity $entity):Stand;

}

Voila, je n'arrive pas trop à me projeter et je ne sais pas si il y'a deja des solutions épouvés pour répondre a ce besoin. Merci pour votre aide.

Aucune réponse


Hello,

En fait, j'ai rien compris sur le besoin, en dehors de faire "autre chose qu'Eloquent". J'entends que tu n'as pas envie de passer par Eloquent, sûrement pour faire une couche d'abstraction côté BDD au cas où tu changes d'ORM. Après honnêtement, changer d'ORM sur un Framework qui vient avec, j'ai envie de dire "Mouais".

Quoiqu'il en soit, j'ai l'impression que tu es totalement perdu, parce que tu mélanges le concept des repositories pattern avec le typage de ton code. Le typage, les interfaces, etc, bah tu peux le faire où tu veux, quand tu veux et pour ce que tu veux.

Dans ton cas, il faudrait effectivement que tu fasses une interface, avec des méthodes et des signatures. Mais tu dois effectivement aussi, concevoir ces méthodes avec des signatures logiques, et fixes. On ne change pas la signature d'une interface comme ça, pour le fun. De plus, l'interface doit être suffisamment neutre pour pouvoir être appliquée à l'ensemble des classes que tu vas toucher.

En gros, j'dirais qu'avant de te lancer dans ton développement, tu devrais concevoir sur papier, ou via uml, ce que tu veux pour ton application. Ainsi tu vas pouvoir voir quels sont les éléments dupliqués afin de pouvoir concevoir les bonnes interfaces, éviter la duplication de code, etc.

En terme de conception je te conseille ce site : https://refactoring.guru/fr/design-patterns il est plutôt intéressant.

Et puis j'ai vu aussi cet article là pour le "Repository" via Laravel. https://dev.to/victoor/repository-pattern-in-laravel-it-s-worth-3mn4 Mais perso même l'auteur le dit, ça correspond pas à la chose.

En tous cas, bon courage à toi !

PS : Désolé pour la réponse 4 mois après, j'viens juste de tilter ahah.