Що таке __construct та _construct у magento2?


Відповіді:


17

Я не зовсім впевнений, чи змінився він між Magento 1 і Magento 2, напевно, не так, що я збираюся піти з тим, що знаю з Magento 1.

Заповіт _constructбуде викликано після__construct

Народний __constructметод PHP не повинен бути перезаписаний або використаний у вашому коді. Якщо ви хочете виконати код безпечним способом на початку використання класу _construct.

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


15

Метод _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();
}

Чи можете ви надати приклад?
zed Blackbeard

У М2? я можу вдосконалити відповідь, щоб зробити більш зрозумілою різницю, але я не знаю, чи потрібен приклад,
MauroNigrele

Мене цікавить ваша думка щодо чогось, що стосується DI та __construct (). Здається, що так звана "логіка DI" в Magento2 реалізована як анти-модель, оскільки вона насправді створює щільне з'єднання. Запуск оновлення композитора, залежно від того, скільки 3D-модулів партії ви розширили за допомогою своїх модулів, часто може призвести до необхідності налагодження, додавання парам в конструкторах, які насправді не використовуються в дочірніх класах, просто для того, щоб програма не працювала. Не впевнений, що це навіть слід назвати "введенням залежності", але залежність на
зав'язку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.