Использование $ Installer v $ Это в сценариях установки
-
16-10-2019 - |
Вопрос
Хорошо, используя установленные сценарии, кажется, странное соглашение для использования следующего:
$installer = $this;
Я действительно не понимаю этого, так как это совершенно избыточно.
Почему бы просто не использовать $this->
на протяжении всего сценария?
Есть идеи о том, почему эта конвенция существует?
Решение
Ответ намного проще. В 2007 году (и я считаю, что до 2009 года, когда Phpstorm начал качаться) никому не позволила предоставить встроенный Phpdoc для $this
. Анкет Но основные разработчики хотели иметь автозаполнение в IDE. Вот почему они использовали эти 2 строки:
$installer = $this;
/* @var $installer <appropriate class> */
Некоторые модули имеют собственный класс настройки, и он должен был использоваться в inline phpdoc. Но поскольку скрипт настройки/обновления был (и всегда был создан с помощью «копирования/вставки некоторых существующих и изменить». Вы можете найти, возможно, примеры, когда у модуля есть собственный класс настройки (или использует модель настройки EAV Mage_Eav_Model_Entity_Setup
) но Mage_Catalog_Model_Resource_Setup
используется в inline phpdoc в сценарии обновления.
Другие советы
Самая старая версия, которая у меня есть, - 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
И у меня не было никаких проблем (если это каким -либо образом мэрию).
Это конвенция неизвестной и, возможно, сомнительной логики, присутствующей с самой ранней публичной бета -версии 2007 года (Предварительный просмотр B1 0.6.12383; Вход требуется).
Он используется в качестве соглашения, чтобы гарантировать, что класс, который выполняет код настройки, последовательно подсеивается в сценариях настройки. Например, в то время как оба Enterprise_GiftWrapping
а также Enterprise_Rma
Модули имеют свои собственные классы настройки, каждый из которых псевдоним $installer
к примеру Mage_Catalog_Model_Resource_Setup
При добавлении атрибутов в сущность продукта, например:
app/code/core/enterprise/diftrapping/sql/enterprise_giftwrapping_setup/install-1.11.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
Одна вещь, которая мне нравится в использовании $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'; Upgrade worked! Debug data dump: array(4) { 'id' => int(123) 'foo' => string(3) "bar" }
Конечно с 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
Я предполагаю, что это с более ранних дней (
Мы всегда делали это так
Тебе известно ;-)