当我认为我围绕着来自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>。

imo,使用uplientor注入以才能实现。再次,我不太了解Magento的实施,如果它有工厂的概念,那么从快速看起来它看起来就像它支持它们,但明确地定义你的类并使用服务定位器在工厂类中构建它们是一种更清洁的方法。

这是来自有限的人接触上述图案,所以我还想听到其他人关于此事的思想/经验!

更多读

使用辅助者的另一种方法(在模板中)是:

$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的指导方针实施,辐射有限。打破建议时,会发生问题。

许可以下: CC-BY-SA归因
scroll top