Was ist der Kontextobjektzweck in der Konstruktor-DI einer Klasse? Wie funktioniert der Kontext?

23

In den meisten Konstruktoren der Klasse wird ein Context-Objekt übergeben. Ich konnte nicht verstehen, wie dieses Kontextobjekt funktioniert. Mir ist auch aufgefallen, dass dies manchmal an den Konstruktor der übergeordneten Klasse übergeben wird, wie unten dargestellt.

public function __construct(
    \Magento\Framework\App\Action\Context $context,
    \Magento\Catalog\Model\Design $catalogDesign,
    \Magento\Catalog\Model\Session $catalogSession,
....
    parent::__construct(
        $context,
        $layoutFactory,

Können Sie bitte erklären, wie dieses spezielle Kontextobjekt funktioniert?

Lerner
quelle

Antworten:

30

Beachten Sie, dass es verschiedene Context-Objekte gibt. In diesem Fall ist dies der Fall. Um dies \Magento\Framework\App\Action\Contextzu verstehen, sollten Sie es als "ActionContext" lesen. Es stellt den Anwendungskontext dar, in dem die Aktion ausgeführt wird. Mit anderen Worten erhalten Sie Zugriff auf alle Objekte mit Anwendungsstatus, die eine Controller-Aktion benötigt, z. B. die Registrierung oder das Anforderungsobjekt.

Die Kontextklassen haben keine eigene Funktionalität, sie sind nur ein Container für andere Objekte. Sie können sie als Verknüpfung anzeigen, um nicht 20 Parameter in jeder Controller-Aktion zu haben. Alle gängigen Parameter werden im Kontextobjekt zusammengeführt.

Fabian Schmengler
quelle
Wie könnte ich wissen, welche Objekte von verschiedenen enthalten sind $context?
LucScu
@LucaS schauen sich ihren Quellcode an. Die enthaltenen Klassen finden Sie im Context-Konstruktor
Fabian Schmengler
15

Es wurden Kontextobjekte eingeführt, um Entwickler von Drittanbietern von Änderungen in Konstruktoren abstrakter Klassen zu isolieren.

In Magento 1 Abstract wurden Klassen mit viel "Helfer" -Verhalten als praktische API für Class Extender angesehen. Dies verursachte große Anzahl von Methoden und impliziten Abhängigkeiten in abstrakten Klassen ( AbstractModel, AbstractBlock, AbstractAction)

In Magento 2 wird von vererbungsbasierten APIs (genauer gesagt SPIs) abgeraten, es gibt jedoch noch viele ältere APIs. Ursprünglich wollten wir schrittweise zusätzliches Verhalten aus abstrakten Klassen entfernen. Um nicht alle Extender zu unterbrechen, wenn wir eine Abhängigkeit vom Konstruktor entfernen würden, haben wir Context-Objekte eingeführt.

Derzeit ist geplant, vererbungsbasierte APIs mit schnittstellenbasierten APIs irgendwann aufzugeben.

Anton Kril
quelle