ServiceLocator, lassen Sie uns darüber im ZF2-Kontext nachdenken

Nach Marcos Pivetta-Gedanken mitDie, Dies Alte Frage und meine Antwort aufeine andere Frag

Ich habe mich selbst befragt, wie ich unsere Services in der Zend Framework 2-Anwendung besser nutzen kann.

atsächlich können wir dasServiceLocatorAwareInterface kombiniert mitServiceLocatorAwareTrait. Mit der Tatsache,In ZF3 Service Locator wird in der Steuerung entfernt Es ist möglich, dass sie diese Schnittstelle auch entfernen oder Personen, die sie nicht verwenden, raten, es ist sinnvoll.

ie einzige Möglichkeit, wie unsere Dienste aufgebaut sein können, is

Verwenden Sie in Ihren Diensten nicht ServiceLocator, sondern DependancyInjection.

Das Problem ist

Einige Projekte sind einfach so groß, dass Sie entweder:

15 Service-Klassen für einen Workflow.Eine Serviceklasse mit 15 Abhängigkeiten. Wählen Sie Ihren Albtraum ...

Ein Beispiel für das, was Sie in einem Dienst benötigen:

Get back the formManager (kann im Controller nicht aufgerufen werden) Möglicherweise muss Ihr ViewRenderer eine Vorlage rendern, bevor eine HTML-Zeichenfolge über AJAX und eine JSON-Antwort an die Ansicht zurückgegeben werden kann. Möglicherweise müssen Sie den Übersetzer oder jeden gewünschten Service von ZF2 @ zurückerhalteHolen Sie sich an Ihren Entitätsmanager. Wenn Sie mehrere Datenbanken haben, fügen Sie hier die Anzahl hinzu.olen Sie sich andere Dienste wie MailService, ExportService, ImportService und so weiter ...Wenn Sie bestimmte Services laden müssen, hängt dies von einem Client ab (Multi-Client-Website in BtoB ... fügen Sie einige Services hinzu, da Sie eine AbstractFactory nicht laden können | nennen)

Vielleicht können einige dieser Punkte durch Tricks gelöst werden, die ich nicht kenne.

Meine Frage ist

Ist es eine gute Praxis, 15 oder mehr Abhängigkeiten für einen Dienst zu haben und den ServiceLocator in Controllern, aber auch in Diensten aufzugeben?

Bearbeiten von Kommentaren

Um meinen Standpunkt zu veranschaulichen, füge ich einen meiner Konstruktoren ein:

public function __construct(
    ToolboxService $toolboxService,
    EntityService $entityService,
    UserService $userService,
    ItemService $itemService,
    CriteriaService $criteriaService,
    Import $import,
    Export $export,
    PhpRenderer $renderer
) {
    $this->toolboxService = $toolboxService;
    $this->entityService = $entityService;
    $this->userService = $userService;
    $this->emOld = $this->toolboxService->getEmOld();
    $this->emNew = $this->toolboxService->getEmNew();
    $this->serviceLocator = $this->toolboxService->getServiceLocator();
    $this->itemService = $itemService;
    $this->criteriaService = $criteriaService;
    $this->import = $import;
    $this->export = $export;
    $this->renderer = $renderer;
    $this->formManager = $this->toolboxService->getFormManager();
}

Wie Sie sehen, ist ToolboxService ein Objekt mit mehreren Abhängigkeiten. Dieser Dienst befindet sich in meinem Anwendungsordner und fast überall. Ich habe 2 Entity Manager (Verbindung zu 2 Datenbanken, aber vielleicht brauche ich bald eine dritte ...)

Sie können sehen, dass ich den serviceLocator in einer Abhängigkeit verwende, sodass dieser Dienst @ nicht implementierServiceLocatorAwareInterface. Wenn ich es nicht benutze, bin ich für meinen AbstractFactory-Anruf mit @ beschisse

// Distribute somes orders depends on Clients
$distributionClass = $this->serviceLocator->get(ucfirst($param->type));
            if ($distributionClass instanceof DistributeInterface) {
                $distributionClass->distribute($orders, $key);
            } else {
                throw new \RuntimeException("invalid_type_provided", 1);
            }

Antworten auf die Frage(2)

Ihre Antwort auf die Frage