Utilisation de $ installer v $ this dans les scripts d'installation

17

Ok, en utilisant des scripts d'installation, il semble y avoir une convention étrange pour utiliser ce qui suit:

$installer = $this;

Je ne comprends vraiment pas cela car c'est complètement redondant.

Pourquoi ne pas simplement utiliser $this->tout au long du script?

Des idées sur la raison de cette convention?

Marty Wallace
la source
Je reçois des avertissements à propos de cette utilisation en dehors du contexte d'objet dans vscode. Une idée de comment résoudre ce problème?
Henry's Cat

Réponses:

11

La réponse est beaucoup plus simple. En 2007 (et je crois jusqu'en 2009, lorsque PhpStorm a commencé à basculer), aucun IDE n'a permis de fournir du phpdoc en ligne $this. Mais les développeurs principaux voulaient avoir l'auto-complétion dans IDE. C'est pourquoi ils ont utilisé ces 2 lignes:

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

Certains modules ont leur propre classe de configuration et elle aurait dû être utilisée en phpdoc en ligne. Mais parce que le script de configuration / mise à niveau a été (et est) toujours créé via "copier / coller une copie existante et la modifier", vous pouvez trouver des exemples de module ayant sa propre classe de configuration (ou utilisant le modèle de configuration eav Mage_Eav_Model_Entity_Setup) mais Mage_Catalog_Model_Resource_Setuputilisé en phpdoc en ligne dans la mise à niveau scénario.

Dmytro Zavalkin
la source
8

La version la plus ancienne que j'ai est 1.0. Même alors $installer = $this;existé. Même dans les fichiers nommés, upgrade-0.x.y-0.z.tcette ligne existe.

À mon avis, quand ils ont commencé (je veux dire la version 0.1 ou quelque chose comme ça), ils avaient quelque chose comme ça $installer = new Something()et ils ont décidé de changer la logique.
Je suppose cela à cause de la <class>balise dans config.xmlcertains modules (Mage_Catalog par exemple). Versions antérieures à 1.6:

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

Ou dans les versions 1.6+:

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

J'utilise habituellement à la $thisplace de $installeret je n'ai eu aucun problème (si cela est important).

Marius
la source
5

Il s'agit d'une convention de logique inconnue et peut-être douteuse présente depuis la première version bêta publique de 2007 ( aperçu B1 0.6.12383 ; connexion requise).

Il est utilisé comme convention pour garantir que la classe qui exécute le code d'installation est systématiquement aliasée dans les scripts d'installation. Par exemple, alors que les modules Enterprise_GiftWrappinget Enterprise_Rmaont leurs propres classes de configuration, ils ont chacun un alias $installerpour une instance Mage_Catalog_Model_Resource_Setuplors de l'ajout d'attributs à l'entité produit, par exemple:

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
Benmarks
la source
4

Une chose que j'aime à propos de l'utilisation $installerque je veux vraiment ajouter, c'est qu'il est facile de le remplacer par quelque chose d'autre ou de l'exécuter en dehors de la portée de la classe.


1. Le remplacer:

$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. Champ d'application extérieur:

$ php -a
php> require_once 'app / Mage.php';
php> Mage :: init ();
php> nécessite 'app / code / local / Vendor / Module / data / vendormodule_setup / data-upgrade-0.1.1-0.1.2.php';
La mise à niveau a fonctionné!
Débogage du vidage des données: array (4) {
  'id' =>
  int (123)
  'foo' =>
  string (3) "bar"
}

Bien sûr d' data-upgrade-0.1.1-0.1.2.phpavoir:

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

Cela empêche donc Fatal error: Using $this when not in object context

7ochem
la source
$ installer = Mage :: getSingleton ('eav / entity_setup', 'eav_setup'); est important de se rappeler ... Vous n'êtes pas limité à seulement Mage :: getResourceModel ('catalog / setup' ...
CarComp
3

Je suppose que c'est des jours précédents (<v.1.1). Mais pour être honnête, je n'en ai aucune idée. Je pense que c'est un peu plus lisible ...

Nous l'avons toujours fait comme ça

Tu sais ;-)

Fabian Blechschmidt
la source
Je ne pense pas que cela ait beaucoup de sens dans un code PHP OOP, mais je l'ai également utilisé au départ. Puis, à un moment donné, il a complètement ignoré cette partie et n'a jamais eu de problème. Donc, mon expérience est que vous pouvez ignorer ce code en toute sécurité.
Petar Dzhambazov
Oui, je le pense aussi. J'y suis juste habitué ...
Fabian Blechschmidt