Использование $ 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используется во встроенном 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 года ( Preview B1 0.6.12383 ; требуется вход в систему).

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

Приложение / код / ​​ядро ​​/ Enterprise / подарочная упаковка / SQL / enterprise_giftwrapping_setup / установки-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
benmarks
источник
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> require_once 'app / Mage.php';
php> Mage :: init ();
php> require 'app / code / local / Vendor / Module / data / vendormodule_setup / data-upgrade-0.1.1-0.1.2.php';
Обновление сработало!
Отладочный дамп данных: array (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

7ochem
источник
$ installer = Mage :: getSingleton ('eav / entity_setup', 'eav_setup'); важно помнить ... Вы не ограничены только Mage :: getResourceModel ('catalog / setup' ...
CarComp
3

Я предполагаю, что это с более ранних дней (<v.1.1). Но если честно, понятия не имею. Я думаю, что это немного лучше читается ...

Мы всегда так делали

Вы знаете ;-)

Фабиан Блехшмидт
источник
Я не думаю, что это имеет какой-то смысл в любом коде ООП PHP, но использовал его изначально тоже. Затем в какой-то момент полностью проигнорировал эту часть, и никогда не было никаких проблем. Итак, мой опыт показывает, что вы можете спокойно игнорировать этот код.
Петар Джамбазов
Да, я тоже так думаю. Я просто привык к этому ...
Фабиан Блехшмидт