7
Magento 2:直接使用还是不使用ObjectManager?
好的,昨天我们就与Magento社区的其他人就直接使用ObjectManagerclass / 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有什么后果?