IT-Storm

Лучший код тот, который не написан

Menu

Magento 2: di.xml предпочтения (preference) для классов и интерфейсов

Magento 2: di.xml предпочтения (preference) для классов и интерфейсов

Рассмотрим как в Magento 2, файле di.xml, устанавливаются preference (предпочтения) для классов, которые будут применяться  при Dependency Injection (внедрении зависимостей).

Давайте найдем в PhpStorm имя этого класса Magento\Framework\App\RequestInterface и откроем этот файл. Этот интерфейс определяет методы, которые используются для получения информации, связанной с текущим веб-запросом. Если мы его откроем, то увидим getModuleName(), getActionName(), getParam(), setParams() и другие.
Также, вы заметите маленькую иконку «i» в PhpStorm. Щелкните ее, и вы увидите все классы, реализующие этот интерфейс. Это существенная экономия времени!!!

Magento phpStorm plugin
Мы видим, что существуют реализации для запросов Http, а также запросов Webapi.
Давайте продолжим и откроем класс Http который служит для обработки обычных веб-запросов http. Этот класс содержит множество функций, а также расширяет базовый класс Request. Если мы откроем его, то увидим реализации еще большго количества методов содержащихся в RequestInterface, включая getParam(), setParams() и другие.
Если мы закроем это и вернемся к RequestInterface, вы увидите маленькую иконку со скобками. Этот значок доступен, только если у вас установлен плагин Magento PhpStorm. Если вы этого не сделаете, загрузите и включите его прямо сейчас! Щелчок по этому значку даст нам нечто другое: список XML-файлов, определяющих preference (предпочтения), используемые для этого интерфейса.

Magento phpStorm plugin preferences
Если мы откроем этот файл di.xml, мы увидим, что это большой XML-файл с множеством узлов , и мы попадаем точно в preference для нашего RequestInterface.

Этот файл определяет настройки для интерфейсов. Как именно - определяется этим узлом . Атрибут for определяет, на какой интерфейс мы хотим сослаться, а атрибут type определяет, какой класс использовать для этого интерфейса. Эта строка говорит нашей Magento следующеe: - «когда запрашивается объект для класса Magento\Framework\App\RequestInterface, возвращай класс Magento\Framework\App\Request\Http».

Это может показаться очень, очень сложным, но это дает Magento колосальную расширяемость. Помните, что все узлы XML объединены в одно гигантское дерево XML. Это означает, что при желании, мы можем создать файл di.xml в нашем собственном пользовательском модуле, переопределить настройки класса в этом файле! Это впечатляет.

Итак, зачем вообще нужен этот XML-файл? Что ж, этот файл используется непосредственно Magento при реализации dependency injection (внедрения зависимостей) и Object Manager (диспетчера объектов). При внедрении зависимостей вместо передачи конкретного класса реализующего интерфейс, мы будем передавать реализацию интерфейса которая определяется в XML файле (di.xml). Это означает, что когда мы передаем интерфейс диспетчеру объектов Magento, либо напрямую, либо внедрением зависимости (в конструкторе класса), диспетчер объектов возвращает объект - реализующий этот интерфейс, а не сам интерфейс. Мы увидим пример этого в следующем уроке.
Это одно из волшебных свойств Magento и одна из причин существования Object Manager (диспечера объектов). Вероятно, сейчас это выглядит как дополнительная сложность, но это одна из сверхспособностей Magento, которая обеспечивает почти неограниченную расширяемость, когда дело доходит до изменения ядра и создания сторонних модулей.

Magento 2