Uso de $ installer v $ this en los scripts de instalación

17

Ok, usando scripts de instalación parece haber una convención extraña para usar lo siguiente:

$installer = $this;

Realmente no entiendo esto, ya que es completamente redundante.

¿Por qué no solo usarlo en $this->todo el script?

¿Alguna idea de por qué existe esta convención?

Marty Wallace
fuente
Recibo advertencias sobre este uso fuera del contexto del objeto en vscode. ¿Alguna idea de cómo soluciono esto?
El gato de Henry

Respuestas:

11

La respuesta es mucho más simple. En 2007 (y creo que hasta 2009, cuando PhpStorm comenzó a funcionar), ningún IDE permitió proporcionar phpdoc en línea $this. Pero los desarrolladores principales querían tener autocompletado en IDE. Por eso usaron estas 2 líneas:

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

Algunos módulos tienen su propia clase de configuración y deberían haberse utilizado en phpdoc en línea. Pero debido a que el script de configuración / actualización siempre se creó (y se crea) a través de "copiar / pegar alguno existente y cambiar", puede encontrar ejemplos cuando el módulo tiene su propia clase de configuración (o usa el modelo de configuración eav Mage_Eav_Model_Entity_Setup) pero Mage_Catalog_Model_Resource_Setupse usa en phpdoc en línea en la actualización guión.

Dmytro Zavalkin
fuente
8

La versión más antigua que tengo es la 1.0. Incluso entonces $installer = $this;existió. Incluso en los archivos llamados upgrade-0.x.y-0.z.testa línea existe.

En mi opinión, cuando comenzaron (me refiero a la versión 0.1 o algo así) tenían algo como $installer = new Something() y decidieron cambiar la lógica.
Supongo esto debido a la <class>etiqueta en config.xmlalgunos módulos (Mage_Catalog por ejemplo). Versiones anteriores a 1.6:

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

O en las versiones 1.6+:

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

Usualmente uso en $thislugar de$installer y no tuve ningún problema (si eso importa de alguna manera).

Marius
fuente
5

Esta es una convención de lógica desconocida y posiblemente dudosa presente desde la primera versión beta pública de 2007 ( Vista previa B1 0.6.12383 ; se requiere inicio de sesión).

Se usa como una convención para garantizar que la clase que está ejecutando el código de instalación tenga un alias constante en los scripts de configuración. Por ejemplo, si bien los módulos Enterprise_GiftWrappingy Enterprise_Rmatienen sus propias clases de configuración, cada alias$installer a una instancia de Mage_Catalog_Model_Resource_Setupcuando agrega atributos a la entidad del producto, por ejemplo:

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
puntos de referencia
fuente
4

Una cosa que me gusta de usar $installerque realmente quiero agregar es que hace que sea fácil reemplazarlo por otra cosa o ejecutarlo fuera del alcance de la clase.


1. Reemplazándolo:

$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. Alcance externo:

$ php -a
php> require_once 'app / Mage.php';
php> Mage :: init ();
php> requiere 'app / code / local / Vendor / Module / data / vendormodule_setup / data-upgrade-0.1.1-0.1.2.php';
Actualización funcionó!
Volcado de datos de depuración: array (4) {
  'id' =>
  int (123)
  'foo' =>
  cadena (3) "barra"
}

Por supuesto con data-upgrade-0.1.1-0.1.2.phptener:

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

Entonces esto previene Fatal error: Using $this when not in object context

7ochem
fuente
$ installer = Mage :: getSingleton ('eav / entity_setup', 'eav_setup'); es importante recordar ... No está limitado solo a Mage :: getResourceModel ('catalog / setup' ...
CarComp
3

Supongo que es de días anteriores (<v.1.1). Pero para ser honesto, no tengo idea. Creo que es un poco mejor legible ...

Siempre lo hemos hecho así

Ya sabes ;-)

Fabian Blechschmidt
fuente
No creo que tenga mucho sentido en ningún código PHP OOP, pero lo usé inicialmente también. Luego, en algún momento, ignoré esa parte por completo y nunca tuve ningún problema. Entonces, mi experiencia es que puedes ignorar este código de manera segura.
Petar Dzhambazov
Sí, yo también lo creo. Estoy acostumbrado a eso ...
Fabian Blechschmidt