J'ai une application Laravel et je crée une classe qui importe des données. Les données sont stockées dans environ 15 modèles différents, j'ai donc une classe à gérer chaque car chacune a sa propre implémentation. De plus, d'autres modèles pourraient être ajoutés dans le futur.Conception pour une classe demandant plusieurs classes pour effectuer la même tâche
Je voudrais avoir une ligne de code comme $importer->import()
dans une classe Importer
, qui prend ensuite toutes les 15 des classes d'implémentation, et appelle leurs méthodes import()
.
Cependant, la méthode générique $importer->import()
ressemblera alors à:
public function __construct(ImporterOne $one, ImporterTwo $two, ImporterThree $three, etc..)
{
$this->importerOne = $importerOne;
$this->importerTwo = $importerTwo;
// etc ...
$this->importerFifteen = $importerFifteen;
}
public function import()
{
$this->importerOne->import();
$this->importerTwo->importer();
// etc...
}
Cela ne semble pas très bien parce que cette classe aura alors 15+ DEPENDANCES tout faire essentiellement la même chose. Et puis pour mettre à jour cela, je vais devoir entrer ici et ajouter/supprimer des dépendances et import()
appels de méthode. Donc, ma solution est de déléguer l '«enregistrement» des importateurs à chaque implémentation, plutôt que de laisser la classe Generic Importer responsable. Effectivement, un observateur de toutes sortes. Mais au lieu que le client attache l'observateur au sujet, chaque implémentation se rattache au sujet.
use Importer as GenericImporter
public class importerOne {
public function __construct(SomeModel $model, GenericImporter $importer)
{
$this->importer = $importer;
$this->importer->attach($this);
}
}
// Do the same for each implementation
// and then the generic importer
public class Importer {
protected $importables = [];
public function attach($import_implementation)
{
array_push($importables, $import_implementation);
}
public function import()
{
foreach($this->importables as $importable)
{
$importable->import();
}
}
}
Cela semble agréable et solide. Cependant, le problème est que chaque implémentation utilise maintenant leur propre instance de GenericImporter. Alors, quel est le meilleur moyen d'y parvenir? Dois-je implémenter l'importateur générique en singleton? En outre, à des fins de recherche, cela correspond-il à un certain modèle de conception? Cela ressemble à un ObservorPattern, sauf que chaque observateur s'enregistre lui-même.
merci pour la réponse. Cependant, dans Laravel, lorsqu'une dépendance est résolue via le conteneur IoC, elle ne passe pas par référence. Il instancie une nouvelle instance de cette classe (dans ce cas, l'importateur). Il est logique de le configurer dans le code client, mais en fait, j'essaie d'éviter une situation où si/quand les exigences changent et il y a plus d'implémentations, je ne modifie pas constamment les méthodes/classes/code client pour ajouter/supprimer Implémentations – djt
@dtj: pour la première chose vérifier ma modification ci-dessus. Pour la seconde: si vous avez plus d'un point dans votre client où vous devez attacher les imporables à l'importateur, vous feriez mieux d'utiliser le moyen – Moppo
d'observateur pour ce conseil sur l'instance, je ne le savais pas. Je suppose que le dernier aspect de ceci: Fondamentalement, toutes ces implémentations dépendent de la classe Generic Importer pour exécuter leur fonctionnalité. A partir de maintenant, je dois encore instancier chaque implémentation quelque part dans mon code, pour déclencher l'injection de dépendance de l'importateur générique dans chaque implémentation. J'espérais définir fondamentalement toutes les implémentations quelque part (peut-être dans un Service Provider) et quand j'ai appelé $ importer-> import() de quelque part, l'application sait rassembler ces implémentations et les instancier. – djt