好的,昨天我们就与Magento社区的其他人就直接使用ObjectManager
class / templates进行了大讨论。
我已经知道了我们不应该直接使用ObjectManager的原因,并引用了Alan Kent的话:
有几个原因。该代码将起作用,但是最佳实践是不直接引用ObjectManager类。
- 因为我们这么说!;-)(更好地表示为一致的代码就是好的代码)
- 该代码将来可以与其他依赖项注入框架一起使用
- 测试更加容易 -您可以为所需的类传递模拟参数,而不必提供模拟ObjectManager
- 它使相关性更加清晰 -通过构造函数列表可以清楚地了解代码所依赖的内容,而不是将依赖项隐藏在代码中间
- 它鼓励程序员更好地考虑诸如封装和模块化的概念 -如果构造函数变大,也许这是代码需要重构的标志
根据我在StackExchange中看到的内容,很多人倾向于使用简单/简短/不推荐的解决方案,例如:
<?php
//Get Object Manager Instance
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
//Load product by product id
$product = $objectManager->create('Magento\Catalog\Model\Product')->load($id);
而不是经历痛苦但推荐的过程:
- 创建一个模块
- 宣布偏好
- 注入依赖
- 声明一个公共方法
但是,随之而来的难题是,Magento 2核心文件经常直接调用ObjectManager。可以在此处找到一个简单的示例:https : //github.com/magento/magento2/blob/develop/app/code/Magento/GoogleOptimizer/Block/Adminhtml/Form.php#L57
所以这是我的问题:
- Magento为什么要做他们建议我们不要做的事情?这是否意味着在某些情况下我们应该
ObjectManager
直接使用Direct?如果是这样,那是什么情况? - 直接使用ObjectManager有什么后果?
The intent of zend-servicemanager is for use as an Inversion of Control container. It was never intended as a general purpose service locator [...]
。它也适用于M2。还要检查该There are valid use cases
部分,该部分同样适用于此。