Verwendung von $ installer v $ that in Installationskripten
-
16-10-2019 - |
Frage
OK, mit Installationskripten 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 benutzen $this->
im gesamten Skript?
Irgendwelche Ideen, warum diese Konvention existiert?
Lösung
Die Antwort ist viel einfacher. 2007 (und ich glaube, bis 2009, als Phpstorm anfing zu rocken), darf keine Ideen Inline -PHPDOC für die $this
. Die Kernentwickler wollten jedoch eine Autoperation in der IDE haben. Deshalb verwendeten sie diese 2 Zeilen:
$installer = $this;
/* @var $installer <appropriate class> */
Einige Module haben eine eigene Setup -Klasse und hätte in Inline -PHPDOC verwendet werden müssen. Aber weil das Setup/Upgrade -Skript immer über "Kopieren/einfügen und ändern" erstellt wurde (und werden), können Sie möglicherweise Beispiele finden, wenn das Modul eine eigene Setup -Klasse hat (oder das EAV -Setup -Modell verwendet Mage_Eav_Model_Entity_Setup
) aber Mage_Catalog_Model_Resource_Setup
wird in Inline -PHPDOC im Upgrade -Skript verwendet.
Andere Tipps
Die älteste Version, die ich habe, ist 1.0. Sogar dann $installer = $this;
existiert. Auch in den benannten Dateien upgrade-0.x.y-0.z.t
Diese Linie existiert.
Meiner Meinung nach hatten sie, als sie anfingen (ich meine Version 0.1 oder so), so etwas wie $installer = new Something()
Und sie beschlossen, die Logik zu ändern.
Ich nehme das wegen der an <class>
Tag in der config.xml
von einigen Modulen (zum Beispiel mage_catalog). 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>
Normalerweise benutze ich $this
Anstatt von $installer
Und ich hatte kein Problem (wenn das in irgendeiner Weise vorhanden ist).
Dies ist eine Konvention der unbekannten und möglicherweise zweifelhaften Logik, die seit der frühesten öffentlichen Beta von 2007 vorhanden ist (Vorschau B1 0.6.12383; Anmeldung erforderlich).
Es wird als Konvention verwendet, um sicherzustellen, dass die Klasse, die ein Setup -Code ausführt, in Setup -Skripten konsistent aliaisiert ist. Zum Beispiel, während beide beide Enterprise_GiftWrapping
und Enterprise_Rma
Module haben ihre eigenen Setup -Kurse, sie jeweils Alias $installer
zu einer Instanz von Mage_Catalog_Model_Resource_Setup
Beim Hinzufügen von Attributen zur Produkteinheit: z. B.: zB:
App/Code/Core/Enterprise/Geschenkwrapping/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
Eine Sache, die ich gerne benutze $installer
Ich möchte wirklich hinzufügen, dass es es einfach macht, es durch etwas anderes zu ersetzen oder es außerhalb des Klassenbereichs zu laufen.
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ßenbereich:
$ 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" }
Natürlich mit data-upgrade-0.1.1-0.1.2.php
haben:
//$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
Ich würde vermuten, dass es aus früheren Tagen ist (
Wir haben es immer so gemacht
Du weisst ;-)