Verwendung von $ installer v $ this in Installationsskripten

17

Ok, mit Installationsskripten scheint es eine seltsame Konvention zu geben, um Folgendes zu verwenden:

$installer = $this;

Ich verstehe das wirklich nicht, da es völlig überflüssig ist.

Warum nicht einfach im $this->gesamten Skript verwenden?

Irgendwelche Ideen, warum diese Konvention existiert?

Marty Wallace
quelle
Ich erhalte Warnungen, dass dies außerhalb des Objektkontexts in vscode verwendet wird. Irgendeine Idee, wie ich das behebe?
Henrys Katze

Antworten:

11

Die Antwort ist viel einfacher. Im Jahr 2007 (und ich glaube, bis 2009, als PhpStorm zu rocken begann) durfte keine IDE Inline-Phpdoc für bereitstellen $this. Kernentwickler wollten jedoch eine Autovervollständigung in IDE. Deshalb haben sie diese 2 Zeilen benutzt:

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

Einige Module haben eine eigene Setup-Klasse und sollten in Inline-PHPDOC verwendet werden. Da Setup / Upgrade-Skripte jedoch immer über "Kopieren / Einfügen einer vorhandenen und Ändern" erstellt wurden (und werden), finden Sie möglicherweise Beispiele, wenn das Modul eine eigene Setup-Klasse hat (oder ein EAV-Setup-Modell verwendet Mage_Eav_Model_Entity_Setup), aber Mage_Catalog_Model_Resource_Setupbeim Upgrade in Inline-Phpdoc verwendet wird Skript.

Dmytro Zavalkin
quelle
8

Die älteste Version, die ich habe, ist 1.0. Schon damals $installer = $this;existierte. Auch in den genannten Dateien upgrade-0.x.y-0.z.texistiert diese Zeile.

Meiner Meinung nach hatten sie zu Beginn (ich meine Version 0.1 oder so ähnlich) so etwas $installer = new Something()und beschlossen, die Logik zu ändern.
Ich nehme dies an, weil das <class>Tag in config.xmleinigen Modulen (zB Mage_Catalog) enthalten ist. Versionen vor 1.6:

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

Oder in Versionen 1.6+:

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

Ich benutze normalerweise $thisanstelle von $installerund ich hatte kein Problem (wenn das in irgendeiner Weise von Bedeutung ist).

Marius
quelle
5

Hierbei handelt es sich um eine Konvention unbekannter und möglicherweise zweifelhafter Logik, die seit der frühesten öffentlichen Beta von 2007 vorliegt ( Vorschau B1 0.6.12383 ; Anmeldung erforderlich).

Es wird als Konvention verwendet, um sicherzustellen, dass die Klasse, die den Setup-Code ausführt, in Setup-Skripten konsistent mit Alias ​​versehen ist. Während zum Beispiel sowohl das Enterprise_GiftWrappingals auch das Enterprise_RmaModul ihre eigenen Setup-Klassen haben, ist jeder Alias $installereiner Instanz zugeordnet, Mage_Catalog_Model_Resource_Setupwenn der Produktentität Attribute hinzugefügt werden, z.

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
benmarks
quelle
4

Eine Sache, die ich an der Verwendung $installer, die ich wirklich hinzufügen möchte, mag , ist, dass es einfach ist, sie durch etwas anderes zu ersetzen oder sie außerhalb des Klassenbereichs auszuführen.


1. Ersetzen:

$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. Außerhalb des Anwendungsbereichs:

$ php -a
php> require_once 'app / Mage.php';
php> Mage :: init ();
PHP> erfordert 'app / code / local / Vendor / Module / data / vendormodule_setup / data-upgrade-0.1.1-0.1.2.php';
Upgrade funktioniert!
Daten-Dump debuggen: array (4) {
  'id' =>
  int (123)
  'foo' =>
  Zeichenfolge (3) "Bar"
}

Natürlich mit 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);

Das verhindert also Fatal error: Using $this when not in object context

7ochem
quelle
$ installer = Mage :: getSingleton ('eav / entity_setup', 'eav_setup'); Es ist wichtig sich zu erinnern ... Sie sind nicht nur auf Mage :: getResourceModel ('catalog / setup') beschränkt ...
CarComp 10.11.15
3

Ich denke, es ist aus früheren Tagen (<v.1.1). Aber um ehrlich zu sein, ich habe keine Ahnung. Ich finde es etwas besser lesbar ...

Wir haben es immer so gemacht

Wissen Sie ;-)

Fabian Blechschmidt
quelle
Ich denke, dass es in keinem PHP-OOP-Code viel Sinn macht, aber es anfangs auch verwendet. Irgendwann ignorierte er diesen Teil vollständig und hatte nie ein Problem. Ich habe die Erfahrung gemacht, dass Sie diesen Code ignorieren können.
Petar Dzhambazov
Ja, das denke ich auch. Ich bin es einfach gewohnt ...
Fabian Blechschmidt