Вопрос

Хорошо, используя установленные сценарии, кажется, странное соглашение для использования следующего:

$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

Я предполагаю, что это с более ранних дней (

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

Тебе известно ;-)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top