質問

わかりました、インストールスクリプトを使用すると、以下を使用する奇妙な慣習があるようです。

$installer = $this;

それは完全に冗長であるので、私は本当にこれを理解していません。

使ってみませんか $this-> スクリプト全体?

この大会が存在する理由についてのアイデアはありますか?

役に立ちましたか?

解決

答えははるかに簡単です。 2007年(そして私は2009年までPhpstormが揺れ始めたと信じています) $this. 。しかし、コア開発者はIDEにオートコンプリートを持ちたいと考えていました。それが彼らがこれらの2行を使用した理由です:

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

一部のモジュールには独自のセットアップクラスがあり、インラインPHPDOCで使用されるはずです。ただし、セットアップ/アップグレードスクリプトは「既存のものをコピー/貼り付けて変更する」で常に作成されていた(および変更されている」ため、モジュールに独自のセットアップクラスがある場合(またはEAVセットアップモデルを使用している場合に例を見つけることができます。 Mage_Eav_Model_Entity_Setup) しかし Mage_Catalog_Model_Resource_Setup アップグレードスクリプトのインライン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_GiftWrappingEnterprise_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

私が使用することが好きなことの1つ $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