Hello la communauté,

Je sollicite votre expertise car je ne trouve rien de très probant sur internet (je parle pas franchement l'anglais et je suis pas sure d'utiliser les bons termes et donc de bien taper ma recherche).

Ce que j'essaie de faire c'est de "typer" dynamiquement une variable en paramètre et/ou d'injecter dynamiquement une classe... en gros :

$model = new Model();

public function maSuperFonction($model $item)
{
    return "un truc";
}

ou encore

$v = $this->maSuperFonction($model::class);

J'espère que j'ai pas été trop nébuleux dans mes explications...

Merci d'avance pour vos avis éclairés.

5 réponses


Huggy
Réponse acceptée

Je ne suis pas sûr de comprendre ce que tu souhaites faire.
mais si tu veux refactoriser, tu peux faire en sorte que tous tes models héritent d'une classe abstraite Model qui expose les méthodes findOrFail ...
il suffit ensuite de surcharger ces méthodes pour chaque model
la méthode edit n'attend alors qu'un Model sans trop savoir de quel sous-classe il s'agit (notion de polymorphisme)

Bonjour.
Pour commencer, il y a deux typages différents :

// En commentaire de la fonction
/**
* Ma super fonction fait ....
*
* @var array|\App\Model\Table $model
* @return string
**/
public function maSuperFonction($model): string
{
    return '...';
}
// Directement dans les arguments de la fonction
public function maSuperFonction(array $model): string
{
    return '...';
}

Pour ce qui concerne le premier, il a plus un but informatif, quand au second il peut directement retourner une erreur PHP, si la fonction ne reçois pas ce qu'elle attend.
L'avantage du premier est que tu peux définir plusieurs types pour un/chaque argument, il n'y aura pas d'incidence directe, ce qui n'est pas le cas pour le second.
Quand je dis un but informatif, ça peut autant être pour la personne qui serait menée à lire le code de la classe, que lors de l'utilisation d'un IDE qui est capable de lire les commentaires des classes et autres, mais je ne vais pas m'étendre sur le sujet.

Si tu ne l'as pas fait, je te conseille vivement de suivre la formation Formations PHP » Mise en pratique de la POO en PHP, Grafikart fait justement en sorte dans la formation de définir les typages des classes crées durant celle-ci.

Seenok
Auteur

Hello Lartak,

Merci pour ton retour.

J'ai commencé à suivre la super formation "Mise en pratique de la POO" mais chaque épisode est lourd à digérer... les 27 heures de formations vont me prendre du temps, d'autant plus que je compte pas apprendre à faire un framework (et donc réinventer la roue). Mais y a tellement de choses intéressante dedans, que je pense qu'en effet elle est incontournable pour les padawans comme moi.

Pour en revenir à mon sujet, j'ai bien intégré les deux notions de typage dont tu parles. Etant donné que j'utilise un IDE, j'ai très vite compris l'intérêt du première.

J'essaie de m'efforcer à appliquer la deuxième et ainsi typer les variables en paramètre de mes fonctions mais aussi les valeurs de retour.

En fait mon problème, c'est à mon avis la volonté de factoriser (peut-être trop) mes controllers. J'aimerai avoir un AppController qui extends de Controller, et tous mes controllers qui "extenderaient" pour la plupart de mon AppController. En soit j'ai pas de problème à réaliser ca, sauf pour le typage...

Et dans le cas d'un CRUD, j'aimerai rendre dynamique le typage quand je passe une variable en paramète.

Je prends l'exemple d'une fonction edit avec deux controllers, un article et un role.

ArticleContoller

public function edit(Article $article)
{
    $article = Article::findOrFail($article->id);
    return view('articles.edit', compact('article'));
}

RoleContoller

public function role(Role $role)
{
    $role = Role::findOrFail($role->id);
    return view('roles.edit', compact('role'));
}

Et moi j'aimerai bien faire un truc comme ca, où "UnModel" serait dynamique :

AppController

public function edit("UnModel" $item)
{
    $item = $this->model->findOrFail($item->id);
    return view('layouts.edit', compact('item'));
}

Prochaine étape les tests unitaires... ca va être coton aussi ca :).

Merci d'avance et bon code à tous.

Seenok
Auteur

Hello Huggy,

... Mmmm Intéressant !!! Je crois que t'as compris, même si je m'exprime pas super bien... (beaucoup de notions, termes... c'est pas toujours facile mais si Speedy Gonzales euh je veux dire Grafikart est malgré tout un très bon pédagoge !

En gros faut que je fasse comme pour mon AppController, mais avec un AppModel et que mes models héritent de ce AppModel ?

Seenok
Auteur

TOP ! C'est ca ! Je suis soit pas futé, soit fatigué mais je comprend pas pourquoi j'ai pas éssayé avant...

Merci les gars et à bientôt pour ne nouvelles prises de tête ;)