Pregunta

Ok, utilizando scripts de instalación parece que hay una convención raro utilizar el siguiente:

$installer = $this;

Realmente no entiendo esto, ya que es completamente redundante.

¿Por qué no sólo tiene que utilizar $this-> lo largo de la secuencia de comandos?

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

¿Fue útil?

Solución

La respuesta es mucho más simple. En 2007 (y creo que hasta 2009, cuando comenzó a balancearse PhpStorm) nadie IDE permitido proporcionar phpdoc línea para $this. Pero los desarrolladores del núcleo quería tener la terminación automática de IDE. Es por eso que utilizan estas 2 líneas:

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

Algunos módulos tienen propia clase de instalación y deberían haber sido utilizados en phpdoc en línea. Pero debido a la configuración / script de actualización fueron (y son) siempre se crea a través de "copiar / pegar uno existente y el cambio" se pueden encontrar tal vez ejemplos cuando el módulo tiene propia clase de instalación (o usos EAV modelo de configuración Mage_Eav_Model_Entity_Setup) pero Mage_Catalog_Model_Resource_Setup se utiliza en phpdoc en línea en el script de actualización.

Otros consejos

La versión más antigua que tengo es 1,0. Incluso entonces existía $installer = $this;. Incluso en los archivos con el nombre upgrade-0.x.y-0.z.t existe esta línea.

En mi opinión, cuando empezaron (me refiero a la versión 0.1 o algo así) que tenían algo así como $installer = new Something() y decidieron cambiar la lógica.
Asumo esto a causa de la etiqueta <class> en el config.xml de algunos 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>

Por lo general utilizar $this en lugar de $installer y yo no tenía ningún problema (si es que maters de ninguna manera).

Esta es una convención de lo desconocido y posiblemente dudosa lógica presente desde el primer beta pública de 2007 ( Vista previa B1 0.6.12383 ; requiere inicio de sesión)

.

Se utiliza como una convención para asegurar que la clase que se está ejecutando código de configuración es alias consistente en secuencias de comandos de configuración. Por ejemplo, mientras que tanto los módulos Enterprise_GiftWrapping y Enterprise_Rma tienen sus propias clases de instalación, cada uno de ellos alias $installer a una instancia de Mage_Catalog_Model_Resource_Setup al añadir atributos a la entidad de producto, por ejemplo:.

app / código / core / Empresa / 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

Una cosa que me gusta de usar $installer que realmente quiero añadir es que hace que sea fácil de reemplazar con otra cosa o se ejecute fuera del ámbito 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. Fuera de alcance:

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

Por supuesto, con data-upgrade-0.1.1-0.1.2.php tener:

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

Así que esto impide Fatal error: Using $this when not in object context

Me supongo que es a partir de días anteriores (

Siempre hemos hecho así

Usted sabe; -)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top