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" />

但是我可以根据需要轻松更改它。

什么时候应该在代码中使用类似的接口?
我已经创建了这个不完整的示例模块(抱歉,广告),在这里我曾使用过这样的界面,但是它们全部来自核心。我还没有创建自己的一个。我是不是该?


“比方说它确实很棒。” 它在Stackexchange中是否有浮动的在线人才?因为我会安装它;)
David Manners 2014年

1
@DavidManners我将尝试将所有1.x扩展名移植到2.0,以便也将其移植。我不知道浮动部分,但是我会看看我能做什么。
马里斯(Marius)

恕我直言,这不是Mage2的特定问题,更普遍的是“何时使用接口”。这取决于您希望某人能够扩展您的扩展名。我想说的是在您使用业务逻辑的任何地方,这种情况可能会发生变化。;)除此之外,没有行为的对象(例如简单数据对象)通常不会更改。
Tobias

1
@TobiasZander,您的意思是说我必须为几乎所有内容创建一个接口?该死的,很多工作。
马里乌斯

@Marius,如果您希望100%灵活,那就可以。但是我不会过度设计它。我个人也喜欢odetocode.com/blogs/scott/archive/2009/06/08/…作为实际有用的介绍
Tobias

Answers:


9

恕我直言,这不是Mage2的特定问题,更普遍的是“何时使用接口”。这取决于您希望某人能够扩展您的扩展名。我想说的是在您使用业务逻辑的任何地方,这种情况可能会发生变化。;)除此之外,没有行为的对象(例如简单数据对象)通常不会更改。

如果要100%灵活,则必须以某种方式在所有地方使用接口。但是我不会过度设计它。我个人也喜欢http://odetocode.com/blogs/scott/archive/2009/06/08/when-do-i-use-interfaces.aspx作为实际有用的介绍。


7

Magento2促进了SOLID原理的使用。

依赖反转原理直接说,该代码应依赖抽象(接口)。

接口隔离原理说,许多特定于客户端的接口比一个通用接口要好。类还可以定义受保护的接口,因此从体系结构的角度来看,接口是更可取的。

另外,PHP不支持类的多重继承,但支持接口的多种实现。这是接口的另一点。

因此,可以使用一个简单的规则:如果您不知道要使用什么,请始终使用interfaces

PS。性能这不是我不使用接口的原因


我很好奇接口的使用是否以任何方式影响性能?
amitshree

1
调用自动加载功能并非免费。参见示例:(dl.dropboxusercontent.com/u/3103646/…
KAndy '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.