Что такое жесткая зависимость и что такое мягкая зависимость?

18

В Magento 2 (любая стабильная версия) вы можете запустить эту команду, bin/magento info:dependencies:show-modulesи вы получите CSV-файл в корне вашего приложения, который называется modules-dependencies.csvсо всеми зависимостями модуля, который выглядит следующим образом:

введите описание изображения здесь

Что такое жесткая зависимость и что такое мягкая зависимость? Пример каждого поможет.

Мариус
источник
2
проверить это может помочь devdocs.magento.com/guides/v2.0/architecture/archi_perspectives/…
Кетан Борада
@KetanKpBorada. Благодарю. Хороший материал для чтения, но пример жестких и мягких зависимостей может помочь. Если у вас есть такой пример, пожалуйста, поставьте его в качестве ответа.
Мариус

Ответы:

13

Существует три различных анализатора зависимостей (реализации Magento\Setup\Module\Dependency\ParserInterface):

  • код: ищет классы, используемые в коде
  • config / xml: ищет зависимости в объявлении модуля
  • composer / json: ищет зависимости в composer.json

Единственный, который делает различие между жесткими и мягкими зависимостями, это парсер компоновщика (см .: Magento \ Setup \ Module \ Dependency \ Parser \ Composer \ Json :: extractDependencies () )

Мягкая зависимость представляет собой пакет, перечисленный в «предложить», в жесткой зависимости пакет в «требует».

Тип зависимости по умолчанию - жесткий , это означает, что зависимости, найденные другими анализаторами, всегда являются жесткими (см. Magento \ Setup \ Module \ Dependency \ Report \ Dependency \ Data \ Dependency :: __ construct () ).

Фабиан Шменглер
источник
12

Простое и понятное объяснение (из основного курса Magento U):

Жесткая зависимость

Подразумевает, что модуль не может функционировать без других модулей, от которых он зависит.

Пример жестких зависимостей включает в себя:

  • Модуль содержит код, который напрямую использует логику из другого модуля (экземпляры, константы классов, статические методы, свойства открытого класса, интерфейсы и признаки).
  • Модуль содержит строки, которые включают имена классов, имена методов, константы классов, свойства классов, интерфейсы и признаки из другого модуля.
  • Модуль десериализует объект, объявленный в другом модуле.
  • Модуль использует или изменяет таблицы базы данных, используемые другим модулем.

Magento_AdminNotification имеет жесткую зависимость от Magento_Store

Мягкая зависимость

Подразумевает, что модуль может функционировать без других модулей, от которых он зависит.

Пример мягких зависимостей включает в себя:

  • Модуль напрямую проверяет доступность другого модуля.
  • Модуль расширяет конфигурацию другого модуля.
  • Модуль расширяет компоновку другого модуля.

Magento_AdvancedPricingImportExportимеет мягкую зависимость Magento_CatalogImportExportс кодом, подобным этому:

if (!$model instanceof \Magento\CatalogImportExport\Model\Export\Product\Type\AbstractType) {
    throw new \Magento\Framework\Exception\LocalizedException(
        __(
            'Entity type model must be an instance of'
            . ' \Magento\CatalogImportExport\Model\Export\Product\Type\AbstractType'
        )
    );
}

Если модуль использует код из другого модуля, он должен объявить зависимость явно.

РЕДАКТИРОВАТЬ: только что заметил, что это также четко объяснено в официальном документе: https://devdocs.magento.com/guides/v2.3/architecture/archi_perspectives/components/modules/mod_depend.html

Рафаэль в цифровом пианизме
источник