Что такое __construct и _construct в magento2?

21

В Magento 2 большинство классов имеют эти две конструкции ( __constructи _construct) методы. В чем разница между ними?

Зед Черная Борода
источник

Ответы:

17

Я не совсем уверен, изменилось ли это между Magento 1 и Magento 2, вероятно, нет, поэтому я собираюсь перейти к тому, что я знаю из Magento 1.

_constructБудет называться после того , как__construct

Нативный __constructметод PHP не должен быть переписан или использован в вашем коде. Если вы хотите выполнить код безопасным способом в начале использования класса _construct.

Magento будет использовать натив, __constructчтобы убедиться, что все «готово» для использования класса, например, для определения правильных тегов кеша для определенной модели, например.

Сандер Мангель
источник
15

Метод _construct - это «изобретение Varien», используемое для обобщения логики инициализации в моделях, помощниках и блоках.

Поэтому необычно изменять или повторно объявлять собственный метод __construct () в M1 Models / Blocks или Helpers, поскольку мы всегда используем фабрики Magento. Тем не менее, это не проблема / плохая практика использования (если вы заботитесь о совместимости).

В M2 метод _construct () все еще присутствует в некоторых частях и используется для тех же целей, но теперь (в M2) вся логика DI реализована с помощью __constructor (), так что вы найдете много объявлений конструкций в базе кода.

Кстати нет больше заводов, как Mage::getModel()в M2.

Другими словами:

Метод _construct () реализован Magento в некоторых классах и вызывается автоматически внутри объявления функции __construct , поэтому, если вы расширяете класс Magento, например, Model, вы можете использовать его для выполнения некоторых вещей после создания объекта.

В Resource Model или Model Class вы должны определить _construct()метод для определения таблицы и primary_key

С другой стороны, __construct является нативным методом PHP (все языки OO имеют его), __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();
}
MauroNigrele
источник
Можете ли вы привести пример?
Зед Черная Борода
В м2? я могу улучшить ответ, чтобы прояснить разницу, но я не знаю, нужен ли пример,
MauroNigrele
Меня интересует ваше мнение о том, что связано с DI и __construct (). Похоже, что так называемая «логика DI» в Magento2 реализована как анти-паттерн, поскольку фактически создает тесную связь. Запуск обновления компоновщика, в зависимости от того, сколько модулей сторонних разработчиков вы расширили с помощью своих модулей, часто может привести к необходимости отладки, добавления параметров в конструкторы, которые на самом деле не используются в дочерних классах, просто для поддержания работы приложения. Не уверен, что его даже следует называть «Внедрением зависимостей», но
якорением