В Magento 2 большинство классов имеют эти две конструкции ( __construct
и _construct
) методы. В чем разница между ними?
В Magento 2 большинство классов имеют эти две конструкции ( __construct
и _construct
) методы. В чем разница между ними?
Ответы:
Я не совсем уверен, изменилось ли это между Magento 1 и Magento 2, вероятно, нет, поэтому я собираюсь перейти к тому, что я знаю из Magento 1.
_construct
Будет называться после того , как__construct
Нативный __construct
метод PHP не должен быть переписан или использован в вашем коде. Если вы хотите выполнить код безопасным способом в начале использования класса _construct
.
Magento будет использовать натив, __construct
чтобы убедиться, что все «готово» для использования класса, например, для определения правильных тегов кеша для определенной модели, например.
Метод _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();
}