Utilisez le polymorphisme pour renvoyer plusieurs résultats et utiliser plusieurs comportements en même temps
P粉187677012
2023-09-06 00:04:47
<p>J'utilise Laravel 9 et j'ai une requête qui contient : </p>
<ul>
<li>Paramètre nommé SEASON, la valeur peut être <code>array</code>
Ainsi, le paramètre <code>SEASON</code> peut être <code>array</code>
<li>Le paramètre nommé EXPIRY peut être <code>array</code> ou <code>null</code></li>
</ul>
<p>J'ai deux classes, une pour la fonctionnalité <code>SEASON</code> et une pour la fonctionnalité <code>EXPIRY</code>, toutes deux issues de l'extension <code>Repository</code> Les deux ont une méthode appelée <code>execute</code> qui renvoie un tableau</p>
<pre class="brush:php;toolbar:false;">Référentiel de classes abstraites
{
fonction publique abstraite execute() : array ;
}
L'expiration de la classe étend le référentiel
{
fonction publique exécuter()
{
return ['La requête contient un paramètre d'expiration et les comportements saisonniers sont effectués'] ;
}
}
La saison de classe étend le référentiel
{
fonction publique exécuter()
{
return ['La requête contient le paramètre de saison et les comportements d'expiration sont effectués'] ;
}
}</pré>
<p>Si ma requête contient SEASON, je souhaite appeler la méthode d'exécution de la classe Season, ou si ma requête contient Expiry, je souhaite appeler la méthode d'exécution d'expiration. Ou appelez-les et fusionnez les retours d'exécution dans un tableau afin que je puisse obtenir les résultats. </p>
<pre class="brush:php;toolbar:false;">['La demande contient un paramètre d'expiration et les comportements saisonniers sont effectués', 'La demande contient un paramètre d'expiration et les comportements d'expiration sont effectués']</pre> ;
<p>Voici ce que j'ai essayé dans le contrôleur : </p>
<pre class="brush:php;toolbar:false;">amorçage de la fonction publique ($data)
{
$parseTopics = Helper::parseTopicsRequest();
$basicProgram = nouveau BasicProgramRepository();
$seasonalProgram = new SeasonalProgramRepository($parseTopics['SEASONAL']);
$object = count($parseTopics['SEASONAL']) $seasonalProgram : $basicProgram;
// Polymorphisme
return $object->execute();
}</pré>
<p>Question 1 :
Je ne sais pas si je dois utiliser ceci ou quelque chose de similaire pour résoudre mes besoins : </p>
<pre class="brush:php;toolbar:false;">$employe = new Program(new BasicProgramRepository());</pre>
<p>Résultats attendus :
Le résultat attendu dépend de la disponibilité ou non des paramètres de saison et de l'heure d'expiration. Ce que je veux réaliser, c'est utiliser un comportement différent (méthode d'exécution)</p>
Si vous souhaitez mettre en œuvre une approche polymorphe, il est préférable de créer un référentiel ou quelque chose juste pour gérer cette logique.
Ceci est un exemple.
Vous pouvez l'appeler ainsi.
Cette méthode ne fonctionne qu'avec les valeurs spécifiées par vos paramètres. Si les résultats de retour de la classe Saison et de la classe Expiration sont quasiment les mêmes, il est préférable de les gérer sur des traits. (c'est-à-dire $pattern dans l'exemple de code)
Essayez-en.
J'ai lu les commentaires, alors suivez..
Par exemple, il préfère simplement obtenir le résultat de getResult(). Par conséquent, certains modèles et tant de logique ne doivent pas être écrits sur getResult();
Si vous utilisez des traits, voici un exemple. Tout d’abord, vous devez créer la classe de comportement de gestion.
behaviour.php
Ensuite, vous devez créer un répertoire Comportement au même niveau. Lorsque vous déplacez ce répertoire, vous créez un tel fichier de signature.
La méthodefindAccessibleClass() est chargée de trouver la bonne classe.
Ensuite, vous pouvez appeler cette méthode comme ceci.
S'il y a trop de code dans getResult(), il est préférable de séparer le code responsable.
Pour créer un trait de comportement, getResult n'a pas besoin d'être responsable de la logique comportementale. Bref, ce sera facile à tester ou à réparer.
J'espère que tout se passe bien.