Uso di $ installer v $ this negli script di installazione


17

Ok, usando gli script di installazione sembra esserci una strana convenzione per usare quanto segue:

$installer = $this;

Davvero non lo capisco perché è completamente ridondante.

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

Qualche idea sul perché questa convenzione esiste?


Ricevo avvisi sul fatto che questo viene utilizzato al di fuori del contesto dell'oggetto in vscode. Qualche idea su come lo risolvo?
Henry's Cat,

Risposte:


11

La risposta è molto più semplice. Nel 2007 (e credo fino al 2009, quando PhpStorm ha iniziato a oscillare), nessun IDE ha permesso di fornire phpdoc in linea $this. Ma gli sviluppatori core volevano avere il completamento automatico in IDE. Ecco perché hanno usato queste 2 linee:

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

Alcuni moduli hanno una propria classe di installazione e avrebbe dovuto essere usato in phpdoc in linea. Ma poiché gli script di installazione / aggiornamento sono stati (e sono) sempre creati tramite "copia / incolla uno esistente e modifica", puoi trovare forse degli esempi in cui il modulo ha una propria classe di installazione (o usa un modello di configurazione eav Mage_Eav_Model_Entity_Setup) ma Mage_Catalog_Model_Resource_Setupviene usato in phpdoc in linea nell'aggiornamento script.


8

La versione più vecchia che ho è 1.0. Anche allora $installer = $this;esisteva. Anche nei file denominati upgrade-0.x.y-0.z.tesiste questa linea.

Secondo me, quando hanno iniziato (intendo la versione 0.1 o qualcosa del genere) avevano qualcosa del genere $installer = new Something()e hanno deciso di cambiare la logica.
Presumo questo a causa del <class>tag in config.xmldi alcuni moduli (ad esempio Mage_Catalog). Versioni precedenti alla 1.6:

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

O nelle versioni 1.6+:

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

Di solito lo uso al $thisposto di $installere non ho avuto alcun problema (se questo si adatta in qualche modo).


5

Questa è una convenzione di logica sconosciuta e forse dubbia presente sin dalla prima beta pubblica del 2007 ( Anteprima B1 0.6.12383 ; login richiesto).

Viene utilizzato come convenzione per garantire che la classe che sta eseguendo il codice di installazione sia costantemente aliasata negli script di installazione. Ad esempio, mentre sia la Enterprise_GiftWrappinge Enterprise_Rmamoduli hanno la loro classi di installazione, che ogni alias $installera un'istanza di Mage_Catalog_Model_Resource_Setupquando si aggiunge attributi per l'entità del prodotto, ad 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

4

Una cosa che mi piace dell'utilizzo $installerche voglio davvero aggiungere è che rende facile sostituirlo con qualcos'altro o eseguirlo al di fuori dell'ambito della classe.


1. Sostituzione:

$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> richiede 'app / code / local / Vendor / Module / data / vendormodule_setup / data-upgrade-0.1.1-0.1.2.php';
L'aggiornamento ha funzionato!
Dump dei dati di debug: array (4) {
  'id' =>
  int (123)
  'foo' =>
  string (3) "bar"
}

Naturalmente con data-upgrade-0.1.1-0.1.2.phpavere:

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


$ installer = Mage :: getSingleton ('eav / entity_setup', 'eav_setup'); è importante ricordare ... Non sei limitato al solo Mage :: getResourceModel ('catalog / setup' ...
CarComp

3

Immagino che sia dei giorni precedenti (<v.1.1). Ma ad essere sincero, non ne ho idea. Penso che sia un po 'meglio leggibile ...

Lo abbiamo sempre fatto così

Sai ;-)


Non penso abbia molto senso in nessun codice PHP OOP, ma lo ho usato anche inizialmente. Poi ad un certo punto ha ignorato completamente quella parte e non ha mai avuto problemi. Quindi la mia esperienza è che puoi tranquillamente ignorare questo codice.
Petar Dzhambazov,

Sì, lo penso anche io. Ci sono appena abituato ...
Fabian Blechschmidt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.