Magento2 Circular Depedency beim Lesen der Konfiguration

8

Ich kann ScopeConfigInterface $scopeConfigbestimmte Objekte nicht erweitern

di.xml

<preference for="Magento\Framework\Logger\Monolog" type="Foo\Log\Logger\FooLog" />

<virtualType name="helper" type="Foo\Log\Helper\Data" />

       <type name="Foo\Log\Logger\FooLog">
          <arguments>
             <argument name="helper" xsi:type="object">Foo\Log\Helper\Data</argument>
          </arguments>
       </type>

FooLog.php

    public function __construct(
     \Foo\Log\Helper\Data $dataHelper
   )
    {
        $this->_scopeConfig = $scopeConfig;
    }

Data.php

public function __construct(ScopeConfigInterface $scopeConfig)
{
    $this->_scopeConfig = $scopeConfig;
}

$this->_scopeConfig->getValue('dev/debug/foo_bar_config', 'default');

Error:

Circular dependency: Magento\Store\Model\ResourceModel\Config\Collection\Scoped depends on Magento\Store\Model\ResourceModel\Config\Collection\Scoped and vice versa.

Ich kann nicht einmal vorhandene Konfigurationen wie in CreateOrder.php erhalten

 $this->scopeConfig->getValue(self::CONFIG_PATH_MERCHANT_ID, $this->sessionQuote->getStoreId());

Das Problem ist, dass die Verwendung ScopeConfigInterface $scopeConfignur für bestimmte Objekte nicht möglich ist, wenn ich versuche, einige andere Objekte wie zu erweitern

 <preference for="Magento\Cms\Controller\Index\Index" type="Foo\Log\Helper\Data" />

Es klappt

*AKTUALISIEREN

Versucht mit Proxy-Klasse - Erfolg

<type name="Foo\Log\Helper\Data">
    <arguments>
        <argument name="configinterface" xsi:type="object">Magento\Framework\App\Config\ScopeConfigInterface\Proxy</argument>
    </arguments>
</type>

Data.php

        public function __construct(
    \Magento\Framework\App\Config\ScopeConfigInterface\Proxy $scopeConfig)
            {
                $this->_scopeConfig = $scopeConfig;
               $host =  $this->_scopeConfig->getValue('dev/debug/remote_server_host');
               // error after getValue
            }
}
xhallix
quelle

Antworten:

17

Ihre Fehlermeldung lautet:

Zirkuläre Abhängigkeit: Magento \ Store \ Model \ ResourceModel \ Config \ Collection \ Scoped hängt von Magento \ Store \ Model \ ResourceModel \ Config \ Collection \ Scoped ab und umgekehrt.

Um zu verstehen, was passiert, sollten Sie sich die Klasse anhand der Fehlermeldung ansehen: Magento\Store\Model\ResourceModel\Config\Collection\Scoped

In seinem Konstruktor sehen wir eine Abhängigkeit von \Psr\Log\LoggerInterface

Wie wir in Ihrer di.xml sehen können, erstellen Sie eine Präferenz für Magento\Framework\Logger\Monolog: <preference for="Magento\Framework\Logger\Monolog" type="Foo\Log\Logger\FooLog"/>

Magento\Framework\Logger\Monologist eine Präferenz für \Psr\Log\LoggerInterfacesich. Sie erstellen also effektiv eine Präferenz für \Psr\Log\LoggerInterfaceund Ihr Foo\Log\Logger\FooLogwird dem Konstruktor zur Verfügung gestellt, \Magento\Store\Model\ResourceModel\Config\Collection\Scopedwann immer es erstellt wird.

Wenn wir uns nun ScopeConfigInterfacedie von Ihrem Helfer angeforderte Implementierung genauer ansehen , werden wir feststellen, dass dies davon abhängt \Magento\Store\Model\ResourceModel\Config\Collection\Scoped.

Also kamen wir in die Situation, wann \Foo\Log\Logger\FooLogwir zum Erstellen eine Instanz benötigen ScopedConfigInterface, und zum Erstellen ScopedConfigInterfacebenötigen wir \Magento\Store\Model\ResourceModel\Config\Collection\ScopedFolgendes \Foo\Log\Logger\FooLog: zirkuläre Abhängigkeit.

Um dies zu beheben, sollten Sie entweder nicht ScopeConfigInterfacein Ihrem Helfer verwenden oder ihn durch Proxy(verzögertes Laden von Objekten) ersetzen , um die zirkuläre Abhängigkeit zu lösen.

Wir werden über einen besseren Algorithmus zur Erkennung zirkulärer Abhängigkeiten nachdenken, der informativere Nachrichten anzeigt.

Anton Kril
quelle
wow, das ist eine super klare Erklärung, vielen Dank dafür. Um dies zu lösen: a) Gibt es eine andere Möglichkeit, Werte vom Admin-Backend abzurufen, ohne ScopeConfigInterface zu verwenden? b) Ich glaube, ich verstehe die Proxy-Sache nicht vollständig. Muss ich ScopeConfigInterface \ Proxy in meinem Helfer verwenden oder was bedeutet das? Wenn ich also eine Konfiguration aus dem Backend verwenden möchte, was wäre die bevorzugte Methode, um damit umzugehen?
Xhallix
Link zur Proxy / Lazy-Loading-Dokumentation in der Antwort hinzugefügt
Anton Kril
Vielen Dank. Eine letzte Sache, würden Sie vorschlagen, einen Proxy zu verwenden oder die Verwendung von scopeconfiginterface zu vermeiden und stattdessen eine andere Methode zu verwenden?
Xhallix
Verwenden Sie einen Proxy für ScopeConfigInterface, um die Instanziierung von ScopeConfigInterface während der Instanziierung des Loggers zu vermeiden
Anton Kril
Ich habe den Proxy für ScopeConfigInterface verwendet, aber dies scheint dies nicht zu beheben.
Weitere Informationen finden
2

In di.xml können Sie Einstellungen oder ein virtuelles Typ-Tag verwenden, mit denen die zirkuläre Abhängigkeit von di.xml überprüft wird

Pradeep Kumar
quelle
Danke für die Antwort, aber ich habe bereits eine Präferenz verwendet. Es funktioniert einfach irgendwie nicht in meinem eigenen Modul
xhallix