Magento 2 Helper实例
-
11-12-2019 - |
题
当我认为我围绕着来自magento 2的DI系统缠绕的东西,有些东西出现,取消了它。
我看到核心代码不同的方法来访问助手。
例如,在Magento\Catalog\Controller\Category::_initCategory
中,有这个:
if (!$this->_objectManager->get('Magento\Catalog\Helper\Category')->canShow($category)) {
return false;
}
.
但是在Magento\Catalog\Block\Category\View
中,辅助程序注入int int构造函数
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Catalog\Model\Layer\Category $catalogLayer,
\Magento\Framework\Registry $registry,
\Magento\Catalog\Helper\Category $categoryHelper,
array $data = array()
) {
$this->_categoryHelper = $categoryHelper;
$this->_catalogLayer = $catalogLayer;
$this->_coreRegistry = $registry;
parent::__construct($context, $data);
}
.
这让我认为应该在控制器和块(和模型)中不同地访问助手,但是我发现一个控制器,其中辅助程序在构造函数生成的过程中注入了帮助。
请为我清除雾。
我应该使用di,何时应该使用Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute
?为什么?
我读过这个问题:实例化员工在magento 2 。这只是一个跟进问题。
解决方案
我更喜欢在可能的情况下,因为使用对象管理器已经违反了遗迹的法律。使用Object Manager时,这些依赖项仅隐藏在方法逻辑中。
其他提示
我对Magento实现不太了解,但它看起来像ObjectManager
是一个服务定位器
一般使用服务定位器访问对象中的依赖性是非常糟糕的,结账掉了本文。
通过构造函数显式定义依赖关系是一种更好的方法。它有助于在单位测试和运行时间问题中没有定义的服务。
将对象管理器注入一个类基本上将注册表注入您的类,该类可以访问所有应用程序服务,这显然是不对的。
我使用 zf2 一个公平的位,通常为服务,控制器和任何类定义小工厂类需要依赖性。这些工厂类可以访问服务定位器,并抓住对象取决于的所有服务,并通过构造函数注入它们。在工厂类中使用服务定位器很好,因为它主要抛弃代码,类似于例如。
这些工厂仍然很容易 test < / a>。
使用辅助者的另一种方法(在模板中)是:
$this->helper('[Vendor]\[Module]\Helper\[Helper Name]')->getMethodName();
.
我希望如果你还没有知道,它很有用。
虽然这是旧的问题,但我不确定 marius 得到了答案。我相信 Marius 可以更好地回答。我想简短地回答它。 为什么Magento 2建议使用DI而不是帮助者?
- 在单元测试中进行隔离可能/容易
- 显式定义类的依赖关系
- 促进良好设计(单责任原则(SRP)
示例)
在模块中使用DI的使用减少了不兼容错误的风险
Magento更改了这些接口的底层实施。
这是了解扩展开发人员的重要概念。
为什么m2核心在某些情况下可能不会使用di?
- 减少类别的数量
- 不是创建不必要的接口
- 没有不相容性错误的风险
虽然核心目录模块已被使用助手,它已经广泛使用了DI。在我的研究中,我发现Magento 2使用了缺乏核心目录辅助文件的少数功能,这些辅助文件不适合服务合同。
如果您必须明确使用磁性定义的类(例如\ Magento \ Catalog \ Model \ Model \ Product),请根据具体实现而不是服务合同接口进行显式依赖关系。
毫无疑问,延伸开发人员应该使用di而不是magento1,如帮手。根据Magento 2的指导方针实施,辐射有限。打破建议时,会发生问题。