Domanda

Ok, usando gli script di installazione sembra che ci sia una convenzione strano per utilizzare il seguente:

$installer = $this;

Io davvero non capisco questo in quanto è del tutto superfluo.

Perché non basta usare $this-> tutto lo script?

Tutte le idee sul perché esiste questa convenzione?

È stato utile?

Soluzione

La risposta è molto più semplice. Nel 2007 (e credo che fino al 2009, quando ha iniziato a dondolo PhpStorm) nessuno IDE permesso di fornire phpdoc linea per $this. Ma gli sviluppatori di base voluto avere il completamento automatico in IDE. È per questo che hanno usato queste 2 linee:

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

Alcuni moduli hanno proprio classe di installazione e dovrebbe sono stati utilizzati in PHPDoc linea. Ma poiché l'installazione script / aggiornamento erano (e sono) sempre creato tramite "copia / incolla qualche esistente e cambiamento" si possono trovare forse esempi in cui modulo è dotato di propria classe di installazione (o usi EAV modello di impostazione Mage_Eav_Model_Entity_Setup), ma Mage_Catalog_Model_Resource_Setup è utilizzato in PHPDoc inline in script di aggiornamento.

Altri suggerimenti

La versione più vecchia che ho è 1.0. Anche allora $installer = $this; esistito. Anche nelle file denominati upgrade-0.x.y-0.z.t esiste questa linea.

A mio parere, quando hanno iniziato (intendo la versione 0.1 o qualcosa di simile) avessero qualcosa come $installer = new Something() e hanno deciso di cambiare la logica.
Presumo perché del tag <class> nella config.xml di alcuni moduli (Mage_Catalog per esempio). Versioni precedenti 1.6:

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

o nelle versioni 1.6 e versioni successive:

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

Io di solito utilizzare $this invece di $installer e non ho avuto alcun problema (se maters in alcun modo).

Questa è una convenzione di ignoto e logico presente possibilmente discutibile dal momento che la prima beta pubblica a partire dal 2007 ( Anteprima B1 0.6.12383 ; login richiesto)

.

E 'usato come una convenzione per garantire che la classe che sta eseguendo codice di impostazione è costantemente alias negli script di configurazione. Ad esempio, mentre entrambi i moduli Enterprise_GiftWrapping e Enterprise_Rma hanno le loro classi di installazione, ognuno $installer alias a un'istanza di Mage_Catalog_Model_Resource_Setup quando si aggiunge attributi per l'entità del prodotto, per esempio:.

app / code / core / Enterprise / Chiudere pacchetti regalo / 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

Una cosa che mi piace di utilizzare $installer che voglio davvero aggiungere è che essa rende facile sostituirlo con qualcos'altro o per eseguirlo al di fuori del campo di applicazione della classe.


1. Sostituendola:

$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. ambito esterno:

$ 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"
}

Naturalmente con data-upgrade-0.1.1-0.1.2.php avere:

//$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);

Quindi questo impedisce Fatal error: Using $this when not in object context

Direi che è da giorni precedenti (

abbiamo sempre fatto in questo modo

Non si sa; -)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top