Лучшие практики Magento 2 DI

19

Допустим, я создаю расширение для Magento 2, которое ... ну ... не важно. Допустим, это супер круто.
Но я хочу убедиться, что это сборка с использованием надлежащих стандартов, чтобы другие разработчики могли расширять ее.

Когда я должен использовать DI в комбинации с интерфейсами, а когда нет?
Чтобы было понятно, вот основной пример.

У класса Magento\Core\Helper\Dataесть конструктор, подобный этому:

public function __construct(
    \Magento\Framework\App\Helper\Context $context,
    \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Framework\App\State $appState,
    PriceCurrencyInterface $priceCurrency,
    $dbCompatibleMode = true
) {
    parent::__construct($context);
    $this->_scopeConfig = $scopeConfig;
    $this->_storeManager = $storeManager;
    $this->_appState = $appState;
    $this->_dbCompatibleMode = $dbCompatibleMode;
    $this->_priceCurrency =  $priceCurrency;
}

Мой вопрос сосредоточен на var \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig(я знаю, что в этом конструкторе есть и другие, но я думаю, что одно объяснение подойдет для всех случаев).

Согласно di.xmlосновному модулю, var будет экземпляром Magento\Framework\App\Config:

<preference for="Magento\Framework\App\Config\ScopeConfigInterface" type="Magento\Framework\App\Config" />

но я могу легко изменить это, если мне нужно.

Когда я должен использовать такие интерфейсы в своем коде?
Я создал этот неполный пример модуля (извините за рекламу), где я использовал такие интерфейсы, но все они исходят из ядра. Я не создал свой собственный. Нужно ли мне?

Мариус
источник
«Допустим, это супер круто». У него есть плавающие головы людей, которые онлайн в стеке обмена? Потому что я бы это установил;)
Дэвид Мэннерс
1
@DavidManners Я постараюсь перенести все свои расширения 1.x на 2.0, чтобы они также были перенесены. Я не знаю о плавающей части, но я посмотрю, что я могу сделать.
Мариус
Имхо, это не специфический вопрос для Mage2, а в целом «Когда использовать интерфейсы». Это зависит от того, где вы хотите, чтобы кто-то смог расширить ваше расширение. Я бы сказал везде, где вы работаете с бизнес-логикой, которая может измениться. ;) Кроме того, объекты без поведения (например, простые объекты данных) обычно не изменятся.
Тобиас
1
@TobiasZander, вы хотите сказать, что я должен создать интерфейс почти для ВСЕГО? Черт, это много работы.
Мариус
@ Мариус, если ты хочешь быть на 100% гибким, почему-то да. Но я бы не стал перегружать это. Мне лично также нравится odetocode.com/blogs/scott/archive/2009/06/08/… как вступление, когда это действительно полезно
Тобиас

Ответы:

9

Имхо, это не специфический вопрос для Mage2, а в целом «Когда использовать интерфейсы». Это зависит от того, где вы хотите, чтобы кто-то смог расширить ваше расширение. Я бы сказал везде, где вы работаете с бизнес-логикой, которая может измениться. ;) Кроме того, объекты без поведения (например, простые объекты данных) обычно не изменятся.

Если вы хотите быть на 100% гибкими, вы должны везде использовать интерфейсы. Но я бы не стал перегружать это. Мне лично также нравится http://odetocode.com/blogs/scott/archive/2009/06/08/when-do-i-use-interfaces.aspx как введение, когда это действительно полезно.

Тобиас
источник
7

Magento2 продвигает использование принципов SOLID .

Принцип прямого обращения зависимостей говорит, что код должен зависеть от абстракций (интерфейсов).

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

Также PHP не поддерживает множественное наследование классов, но поддерживает множественную реализацию интерфейсов. Это еще один момент для интерфейсов.

Таким образом, можно использовать простое правило: если вы не знаете, что использовать, ВСЕГДА используйте интерфейсы .

PS. Производительность это не причина для меня, чтобы не использовать интерфейсы

Канди
источник
Мне интересно, влияет ли использование интерфейсов на производительность?
amitshree
1
Вызов функции автозагрузки не бесплатный. см. пример: ( dl.dropboxusercontent.com/u/3103646/… )
KAndy