Використання $ installer v $ this у сценаріях встановлення


17

Гаразд, із застосуванням сценаріїв установки встановлено дивну умову використовувати наступне:

$installer = $this;

Я насправді не розумію цього, оскільки це абсолютно зайве.

Чому б просто не використовувати $this->весь сценарій?

Будь-які ідеї, чому існує ця конвенція?


Я отримую попередження про те, що це використовується поза контекстом об'єкта у vscode. Будь-яка ідея, як я це виправляю?
Кіт Генріха

Відповіді:


11

Відповідь набагато простіша. У 2007 році (і я вважаю, що до 2009 року, коли PhpStorm почав гойдатися), ніхто IDE не дозволив надавати вбудований phpdoc $this. Але основні розробники хотіли мати автоматичне завершення в IDE. Ось чому вони використовували ці 2 рядки:

$installer = $this;
/* @var $installer <appropriate class> */

Деякі модулі мають власний клас настройки, і він повинен був використовуватися у вбудованому phpdoc. Але оскільки сценарій настройки / оновлення завжди створювався за допомогою "копіювати / вставляти якийсь існуючий та змінювати", ви можете знайти приклади, коли модуль має власний клас настройки (або використовує модель установки EAV Mage_Eav_Model_Entity_Setup), але Mage_Catalog_Model_Resource_Setupвикористовується в Inline phpdoc для оновлення сценарій.


8

Найдавніша у мене версія 1.0. Вже тоді $installer = $this;існували. Навіть у файлах з назвою upgrade-0.x.y-0.z.tцей рядок існує.

На мою думку, коли вони починали (я маю на увазі версію 0.1 чи щось подібне), у них було щось подібне, $installer = new Something()і вони вирішили змінити логіку.
Я припускаю це через <class>тег у config.xmlдеяких модулях (наприклад, Mage_Catalog). Версії до 1.6:

<setup>
    <module>Mage_Catalog</module>
    <class>Mage_Catalog_Model_Resource_Eav_Mysql4_Setup</class>
</setup> 

Або у версіях 1.6+:

<setup>
    <module>Mage_Catalog</module>
    <class>Mage_Catalog_Model_Resource_Setup</class>
</setup>

Зазвичай я використовую $thisзамість цього, $installerі у мене не було жодних проблем (якщо це в будь-якому випадку).


5

Це умова невідомої та, можливо, сумнівної логіки, яка існує з найдавнішої публічної бета-версії з 2007 року ( попередній перегляд B1 0.6.12383 ; обов'язковий вхід).

Він використовується як умова для забезпечення того, щоб клас, який виконує код налаштування, послідовно псевдонімований у сценаріях налаштування. Наприклад, хоча Enterprise_GiftWrappingі Enterprise_Rmaмодулі, і модулі мають свої власні класи настройки, кожен з них є псевдонімом $installerдо екземпляра Mage_Catalog_Model_Resource_Setupпри додаванні атрибутів до продукту, наприклад:

app / code / core / Enterprise / GiftWrapping / sql / enterprise_giftwrapping_setup / install-1.11.0.0.php

<?php

$installer = $this;
/* @var $installer Enterprise_GiftWrapping_Model_Resource_Setup */
//... miscellaneous Enterprise_GiftWrapping setup logic

$installer = Mage::getResourceModel('catalog/setup', 'catalog_setup');
//... miscellaneous product entity attribute manipulation

4

Одне, що мені подобається використовувати, $installerщо я дуже хочу додати, це те, що це дозволяє легко замінити його чимось іншим або запустити його поза межами області класу.


1. Заміна його:

$installer = $this;
/* @var $installer Mage_Core_Model_Resource_Setup */
// Do basic stuff

$installer = Mage::getSingleton('eav/entity_setup', 'eav_setup');
/* @var $installer Mage_Eav_Model_Entity_Setup */
/// Do stuff with attributes


2. Зовнішній обсяг:

$ php -a
php> requ_once 'app / Mage.php';
php> Mage :: init ();
php> вимагають 'app / code / local / Vendor / Module / data / vendormodule_setup / data-upgrade-0.1.1-0.1.2.php';
Оновлення працювало!
Дамп налагодження даних: масив (4) {
  'id' =>
  int (123)
  'foo' =>
  рядок (3) "бар"
}

Звичайно, data-upgrade-0.1.1-0.1.2.phpмаючи:

//$installer = $this;
$installer = Mage::getResourceSingleton('core/setup', 'vendormodule_setup');
/* @var $installer Mage_Core_Model_Resource_Setup */

// Do lots of stuff ...

echo "Upgrade worked!\n";
echo "Debug data dump: ";
var_dump($debug);

Так це заважає Fatal error: Using $this when not in object context


$ installer = Mage :: getSingleton ('eav / entit_setup', 'eav_setup'); Важливо пам’ятати ... Ви не обмежені лише Mage :: getResourceModel ('каталог / налаштування' ...
CarComp

3

Я б здогадався, що це з більш ранніх днів (<v.1.1). Але якщо чесно, я поняття не маю. Я думаю, що це трохи легше читати ...

Ми завжди робили це так

Ти знаєш ;-)


Я не думаю, що це має особливий сенс у будь-якому коді PHP OOP, але спочатку його також використовували. Тоді в якийсь момент повністю проігнорував цю частину, і ніколи не виникло жодного питання. Тож мій досвід полягає в тому, що ви можете сміливо ігнорувати цей код.
Петро Джамбазов

Так, я теж думаю. Я просто звик до цього ...
Фабіан Блешшмідт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.