So überschreiben oder verwenden Sie das Plugin für isWebsiteScope()
Funktionen aus der
Datei Magento \ Customer \ Model \ Config \ Share.php .
Ich habe das Plugin für die unten stehende Funktion verwendet, möchte aber die aktuelle Kundensitzung in der unten stehenden Funktion abrufen. Überprüfen Sie hauptsächlich, ob custoemr angemeldet ist oder nicht .
Verwenden Sie einfach das Plugin und setzen Sie di.xml,
<!-- Override Share.php to set value of website scope -->
<type name="Magento\Customer\Model\Config\Share">
<plugin name="Company_Modulename::Share" type="\Company\Modulename\Plugin\Config\Share\Proxy" sortOrder="1"/>
</type>
In der Share.php-Datei
<?php
namespace Company\Modulename\Plugin\Config;
class Share
{
public function __construct(
\Magento\Customer\Model\Session $customerSession
) {
$this->session = $customerSession;
}
/**
* Check whether current customers sharing scope is website
*
* @return bool
*/
public function afterIsWebsiteScope(\Magento\Customer\Model\Config\Share $subject)
{
if(!$this->session->isLoggedIn()){
return 1;
} else {
return 0;
}
}
}
So erhalten Sie die aktuelle Kundensitzung in der obigen Funktion:
Wenn ich die aktuelle Kundensitzung mit dem Kundensitzungsmodell-Browser verwendet habe, wird ein kreisförmiger Abhängigkeitsfehler ausgegeben.
Magento\Customer\Model\Config\Share
es sich um eine Abhängigkeit von handeltMagento\Customer\Model\Session
, daher der zirkuläre Abhängigkeitsfehler. Ich sehe, was Sie versuchen (dh den Umfang der Website ändern, wenn der Kunde angemeldet ist), konnte dies jedoch nicht herausfinden ein nicht-hackiger Weg auch.\Magento\Framework\ObjectManagerInterface
Antworten:
Der einfachste Weg, zirkuläre Abhängigkeiten aufzulösen (obwohl nicht immer der beste), ist die Verwendung von Proxies.
Der Proxy für eine Klasse ist eine automatisch generierte Klasse (dh Magento erstellt sie automatisch, wenn sie nicht über den Auto-Loader gefunden wird), die vom Objektmanager abhängig ist und dieselbe Schnittstelle wie die ursprüngliche Klasse hat.
Die Implementierung einer beliebigen Methode des Proxys ist nur ein Aufruf derselben Methode der ursprünglichen Klasse. Im Konstruktor ist keine Originalklasse erforderlich, stattdessen wird das Objekt der Originalklasse über den Objektmanager erstellt, wenn zum ersten Mal eine Methode des Proxys aufgerufen wird.
Hier ist ein Beispiel für den Proxy aus dem Core (
\Magento\Backend\Model\Auth\Proxy
):Um einen Proxy zu verwenden, verweisen Sie anstelle des Verweises auf die Klasse (irgendwo in di.xml oder in der Konstruktorabhängigkeit) auf den Proxy, indem Sie den Namen der Klasse anhängen
\Proxy
, dh:Es lohnt sich immer zu analysieren, ob es Möglichkeiten gibt, die Geschäftslogik neu zu schreiben, um zirkuläre Abhängigkeiten zu vermeiden, bevor Proxies verwendet werden (oder aus dem gleichen Grund ein Objektmanager im Konstruktor).
quelle
\Proxy
Suffix an (wie in meinem obigen Beispiel). Erstellen Sie die Proxy-Klasse nicht manuell.isWebsiteScope
vom Konstruktor des aufgerufen wird.Magento\Customer\Model\Session\Storage
Deshalb muss das Objekt zum Zeitpunkt der Erstellung noch erstellt werden, obwohl wir Proxy verwendet haben. Ich sehe auch nicht, wie Object Manager Ihnen hilft (funktioniert bei mir nicht). Ich werde mir genauer ansehen, welche Geschäftslogik Sie implementieren möchten, und sie auf einer anderen Ebene hinzufügen.Die einzige Möglichkeit, die zirkuläre Abhängigkeit zu entfernen, besteht darin, sie
objectManager
direkt zu verwenden .Ich weiß, dass dies ein hässlicher Weg ist, aber ich denke, dies ist der einzige Weg,
Wenn jemand eine bessere Lösung hat, bin ich auch offen für Lösungen
Aber mein Weg unten ist die Lösung:
quelle
circular dependency
aber wir sollten den Objektmanager als Abhängigkeit in Klassendateien verwenden. +1 von mir :)Magento\Customer\Model\Session
vom Konstruktor entfernt? und löschen var / Generation