Magento2 Thông tư phụ thuộc khi đọc cấu hình


8

Tôi không thể sử dụng ScopeConfigInterface $scopeConfigkhi mở rộng một số đối tượng

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;
    }

Dữ liệu.php

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

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

Lỗi:

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

Tôi thậm chí không thể có được các cấu hình hiện có như trong CreatOrder.php

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

Vấn đề là, việc sử dụng ScopeConfigInterface $scopeConfigchỉ không thể sử dụng cho một số đối tượng nhất định, nếu tôi cố gắng mở rộng một số đối tượng khác như

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

nó hoạt động

* CẬP NHẬT

Đã thử với lớp proxy - thành công

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

Dữ liệu.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
            }
}

Câu trả lời:


17

Thông báo lỗi của bạn là:

Phụ thuộc tròn: Magento \ Store \ Model \ ResourceModel \ Config \ Collection \ Scoped phụ thuộc vào Magento \ Store \ Model \ ResourceModel \ Config \ Collection \ Scoped và ngược lại.

Để hiểu những gì xảy ra, bạn nên nhìn vào lớp từ thông báo lỗi: Magento\Store\Model\ResourceModel\Config\Collection\Scoped

Trong constructor của nó, chúng ta thấy một sự phụ thuộc vào \Psr\Log\LoggerInterface

Như chúng ta có thể thấy trong di.xml của bạn, bạn tạo một tùy chọn cho Magento\Framework\Logger\Monolog: <preference for="Magento\Framework\Logger\Monolog" type="Foo\Log\Logger\FooLog"/>

Magento\Framework\Logger\Monologlà một ưu tiên cho \Psr\Log\LoggerInterfacechính nó. Vì vậy, bạn tạo hiệu quả ưu tiên cho \Psr\Log\LoggerInterfacevà bạn Foo\Log\Logger\FooLogsẽ được cung cấp cho nhà xây dựng \Magento\Store\Model\ResourceModel\Config\Collection\Scopedbất cứ khi nào nó được tạo.

Bây giờ nếu chúng ta nhìn sâu hơn vào việc thực hiện ScopeConfigInterfacetheo yêu cầu của người trợ giúp của bạn, chúng ta sẽ thấy rằng nó phụ thuộc vào \Magento\Store\Model\ResourceModel\Config\Collection\Scoped.

Vì vậy, chúng tôi gặp phải tình huống khi tạo \Foo\Log\Logger\FooLogchúng tôi cần cá thể ScopedConfigInterfacevà để tạo ra ScopedConfigInterfacechúng tôi cần \Magento\Store\Model\ResourceModel\Config\Collection\Scopedđiều đó \Foo\Log\Logger\FooLog: phụ thuộc vòng tròn.

Để giải quyết vấn đề này, bạn không nên sử dụng ScopeConfigInterfacetrong trình trợ giúp của mình hoặc thay thế nó bằng Proxy(tải đối tượng lười biếng) để phá vỡ sự phụ thuộc vòng tròn.

Chúng tôi sẽ suy nghĩ về thuật toán phát hiện phụ thuộc vòng tròn tốt hơn sẽ hiển thị nhiều thông tin hơn.


wow, đây là một lời giải thích siêu rõ ràng cảm ơn rất nhiều cho việc này. Để giải quyết vấn đề này: a) có cách nào khác để nhận giá trị từ phụ trợ quản trị mà không cần sử dụng ScopeConfigInterface không? b) Tôi nghĩ rằng tôi không hoàn toàn nắm bắt được điều Proxy Tôi có cần sử dụng ScopeConfigInterface \ Proxy trong trình trợ giúp của tôi không hoặc ý nghĩa của việc này là gì? Vì vậy, khi tôi muốn sử dụng một cấu hình từ phụ trợ, cách tốt nhất để xử lý việc này là gì?
xhallix

Đã thêm liên kết đến tài liệu proxy / lười tải trong câu trả lời
Anton Kril

cảm ơn. Một điều cuối cùng, bạn có đề nghị sử dụng proxy hoặc để tránh sử dụng scopeconfiginterface và sử dụng một số phương pháp khác thay thế?
xhallix

Sử dụng proxy cho ScopeConfigInterface để tránh khởi tạo ScopeConfigInterface trong quá trình khởi tạo logger
Anton Kril

Tôi đã sử dụng proxy cho ScopeConfigInterface nhưng điều này dường như không khắc phục được điều này, vui lòng xem bản cập nhật mới nhất của tôi
xhallix

2

trong di.xml, bạn có thể sử dụng tùy chọn hoặc thẻ loại ảo để kiểm tra sự phụ thuộc vòng tròn trên di.xml


cảm ơn câu trả lời, nhưng tôi đã sử dụng một ưu tiên. Nó chỉ không hoạt động trong mô-đun của riêng tôi bằng cách nào đó
xhallix
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.