Ich bin neu in der modernen Methode der Abhängigkeitsinjektion und ich versuche herauszufinden, wie Sie eine Methode auswählen, welche Klasse basierend auf einer Bedingung zu verwenden. Ich wette, ich habe meine Design-Struktur deaktiviert, aber ich sehe auch nicht, wie man das in Aura DI über die Config macht.AuraPHP DI dynamische Klasse oder entscheidungsbasierte Injektion
Das ist meine Aura Config
<?php
namespace Aura\Cli_Project\_Config;
use Aura\Di\Config;
use Aura\Di\Container;
class Common extends Config {
public function define(Container $di) {
// utilities
$di->set(
'App\Inventory\Utilities\EmailParser',
$di->newInstance('App\Inventory\Utilities\PlancakeParser')
);
// commands
$di->params['App\Inventory\Command\IncomingOrder'] = array(
'stdio' => $di->lazyGet('aura/cli-kernel:stdio'),
'parser' => $di->get('App\Inventory\Utilities\EmailParser')
);
}
// ...
}
Und das ist die Klasse in Frage, die verschiedenen Klassen in Abhängigkeit von der „Quelle“ verwenden, muss es findet.
<?php
namespace App\Inventory\Command;
use Aura\Cli\Stdio;
use App\Inventory\Utilities\EmailParser;
use App\Inventory\Sources\Etsy;
use App\Inventory\Sources\Amazon;
use App\Inventory\Sources\Ebay;
class IncomingOrder {
public function __construct(
Stdio $stdio,
EmailParser $parser) {
$this->stdio = $stdio;
$this->parser = $parser;
}
public function process() {
// other code to parse message
// source is set by determining where it came from
$source = 'Etsy';
switch($source) {
case 'Etsy' :
// This bit seems really wrong
$sourceParser = new Etsy\OrderParser();
break;
case 'Amazon' :
$sourceParser = new Amazon\OrderParser();
break;
case 'Ebay' :
$sourceParser = new Ebay\OrderParser();
break;
default :
$sourceParser = null;
}
// Do source specific processing
}
}
Ist es, die ich brauche meine Verarbeitung an dem Punkt Recht zu spalten, nachdem die Quelle kann so eine neue Klasse bestimmt wird als Parameter mit dieser Quelle initialisiert werden?
Die einzige Möglichkeit, dies in der Konfiguration zu sehen, ist eine faule anonyme Funktion zu tun, um die richtige Quellklasse zurückzugeben, aber das fühlt sich auch gegen moderne Design-Prinzipien.
So in meiner Config I Definitionen für die verschiedene Quelle Parser setzen. Wenn ich dann richtig verstehe, wird die 'SourceFactory' in den 'IncomingOrder' injiziert und nach dem Quellen' $ sourceParser = $ this-> sourceFactory-> newInstance ($ source)'. Ich werde es versuchen. Vielen Dank. –
Ja, Sie haben das gleiche Verständnis. –