magento2中的__construct和_construct是什么?


21

在Magento 2中,大多数类都具有这两种构造方法(__construct_construct)。它们之间有什么区别?

Answers:


17

我不确定在Magento 1和Magento 2之间是否发生了变化,也许不是,所以我将继续我对Magento 1的了解。

_construct会后的被称为__construct

PHP本机__construct方法不应在您的代码中覆盖或使用。如果要在类开始时以安全的方式执行代码,请使用_construct

Magento将使用本机__construct来确保要使用的类一切就绪,例如为特定模型定义正确的缓存标签。


15

_construct方法是“瓦瑞恩发明”用来包裹在模型中,助手和块一些初始化逻辑。

由于我们始终使用Magento工厂,因此在M1模型/块或助手中更改或重新声明本机__construct()方法是不寻常的。但是使用它没有任何问题/不好的做法(如果您关心兼容性的话)。

在M2中,_construct()方法仍然存在于某些部分中,并用于相同的目的,但是现在(在M2中)所有DI逻辑都由__constructor()实现,因此您会在代码库中找到很多构造声明。

顺便说一句,没有像Mage::getModel()M2 这样的工厂了。

换一种说法:

_construct()方法是由Magento的一些类实现的,它会自动调用内部__construct函数声明,所以如果你喜欢扩展模型Magento的类,你可以用它创建对象后执行一些东西。

在资源模型或模型类中,应定义一个_construct()方法以定义表和primary_key

另一方面,__construct是PHP 的本机方法(所有OO语言都有一个),__construct每次实例化对象时都会调用__construct。就这样

例:

Magento \ Framework \ Model \ ResourceModel \ AbstractResource

/**
 * Abstract resource model
 */
abstract class AbstractResource
{
    /**
     * Main constructor
     */
    public function __construct()
    {
        /**
         * Please override this one instead of overriding real __construct constructor
         */
        $this->_construct();
    } ...

Magento \ Framework \ Model \ ResourceModel \ Db \ AbstractDb

/**
 * Class constructor
 *
 * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
 * @param string $connectionName
 */
public function __construct(\Magento\Framework\Model\ResourceModel\Db\Context $context, $connectionName = null)
{
    $this->transactionManager = $context->getTransactionManager();
    $this->_resources = $context->getResources();
    $this->objectRelationProcessor = $context->getObjectRelationProcessor();
    if ($connectionName !== null) {
        $this->connectionName = $connectionName;
    }
    parent::__construct();
}

你能提供例子吗?
zed Blackbeard

在M2中?我可以改善答案,以便更清楚地区别,但我不知道是否需要一个示例,
MauroNigrele 2015年

我对您对DI和__construct()相关的观点感兴趣。似乎Magento2中所谓的“ DI逻辑”被实现为反模式,因为它实际上会产生紧密的耦合。根据您的模块扩展了3d party模块的数量,运行作曲家更新通常会导致需要调试,在构造函数中添加在子类中并未真正使用的参数,只是为了保持应用程序的运行。不知道它甚至应该被称为“依赖注入”,而是依赖锚定之类的东西
someGuyOnTheWeb
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.