Maison > Questions et réponses > le corps du texte
P粉0869937882023-09-06 18:46:06
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.
class SampleRepository { /** * repository instance value * * @var string[] | null */ private $sampleArray; // maybe here is SEASON or EXPIRY or null /** * constructor * * @param string[] | null $sampleArray */ public function __construct($sampleArray) { $this->sampleArray = $sampleArray; } /** * execute like class interface role * * @return array */ public function execute() { return (!$this->sampleArray) ? [] : $this->getResult(); } /** * get result * * @return array */ private function getResult() { // maybe pattern will be better to manage another class or trait. $pattern = [ "SEASON" => new Season(), "EXPIRY" => new Expiry() ]; return collect($this->sampleArray)->map(function($itemKey){ $requestClass = data_get($pattern,$itemKey); if (!$requestClass){ // here is space you don't expect class or canIt find correct class return ["something wrong"]; } return $requestClass->execute(); })->flatten(); } }
Vous pouvez l'appeler ainsi.
$sampleRepository = new SampleRepository($sampleValue); // expect string[] or null like ["SEASON"],["SEASON","EXPIRY"],null $result = $sampleRepository->execute(); // [string] or [string,string] or []
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
<?php namespace App\Repositories; class Behavior { use Behavior\BehaviorTrait; // if you need to add another pattern, you can add trait here. }
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.
<?php namespace App\Repositories\Behavior; trait BehaviorTrait { public static function findAccessibleClass(string $itemKey) { return data_get([ "SEASON" => new Season(), "EXPIRY" => new Expiry() ],$itemKey); } }La méthode
findAccessibleClass() est chargée de trouver la bonne classe.
Ensuite, vous pouvez appeler cette méthode comme ceci.
private function getResult() { return collect($this->sampleArray)->map(function($itemKey){ $requestClass = Behavior::findAccessibleClass($itemKey); // fix here. if (!$requestClass){ // here is space you don't expect class or canIt find correct class return ["something wrong"]; } return $requestClass->execute(); })->flatten(); }
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.