У Magento 2 більшість класів мають ці два конструкти ( __construct
та _construct
) методи. У чому різниця між ними?
У Magento 2 більшість класів мають ці два конструкти ( __construct
та _construct
) методи. У чому різниця між ними?
Відповіді:
Я не зовсім впевнений, чи змінився він між Magento 1 і Magento 2, напевно, не так, що я збираюся піти з тим, що знаю з Magento 1.
Заповіт _construct
буде викликано після__construct
Народний __construct
метод PHP не повинен бути перезаписаний або використаний у вашому коді. Якщо ви хочете виконати код безпечним способом на початку використання класу _construct
.
Magento використовує нативну, __construct
щоб переконатися, що все готово для класу, який використовується, наприклад, для визначення правильних тегів кеша для певної моделі, наприклад.
Метод _construct являв собою "Варіановий винахід", який використовується для введення певної логіки ініціалізації в моделі, помічники та блоки.
Тому незвично змінювати або повторно заявляти нативний метод __construct () у моделях / блоках або помічниках M1, оскільки ми завжди використовуємо фабрики Magento. Однак не існує жодної проблеми / поганої практики щодо його використання (якщо ви дбаєте про сумісність).
У M2 метод _construct () все ще присутній в деяких частинах і використовується для тих же цілей, але зараз (у M2) вся логіка DI реалізована __constructor (), тому ви знайдете безліч декларацій конструкцій у базі коду.
До речі, таких заводів, як Mage::getModel()
у М2, більше немає .
Іншими словами:
Метод _construct () реалізується Magento в деяких класах і викликається автоматично всередині декларації функції __construct , тому, якщо ви розширюєте клас Magento як модель, ви можете використовувати його для виконання деяких речей після створення об'єкта.
У Моделі ресурсу або Класі моделі слід визначити _construct()
метод для визначення таблиці та основного_ ключа
З іншого боку, __construct - це власний метод PHP (усі мови OO мають один), __construct
викликається щоразу, коли інстанціювати об'єкт. Це все
Приклад:
Magento \ Framework \ Модель \ 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 \ Модель \ 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();
}