L'utilisation de $ installation v $ dans cette installation de scripts
-
16-10-2019 - |
Question
Ok, en utilisant des scripts d'installation, il semble être une convention bizarre d'utiliser ce qui suit:
$installer = $this;
Je ne comprends vraiment pas car il est complètement redondant.
Pourquoi ne pas simplement utiliser $this->
à travers le script?
Toutes les idées sur les raisons de cette convention existe?
La solution
La réponse est beaucoup plus simple. En 2007 (et je crois jusqu'en 2009 quand PhpStorm a commencé à bascule) ne IDE autorisé à fournir phpdoc en ligne pour $this
. Mais les développeurs de base voulait avoir autocomplétion dans IDE. Voilà pourquoi ils ont utilisé ces 2 lignes:
$installer = $this;
/* @var $installer <appropriate class> */
Certains modules ont propre classe d'installation et il aurait dû être utilisé dans phpdoc en ligne. Mais parce que le script d'installation / mise à niveau étaient (et sont) toujours créé par « copier / coller certains existant et le changement », vous trouverez peut-être des exemples lorsque le module a sa propre classe d'installation (ou utilise le modèle de configuration de la Mage_Eav_Model_Entity_Setup
) mais Mage_Catalog_Model_Resource_Setup
est utilisé dans phpdoc en ligne dans le script de mise à niveau.
Autres conseils
La version la plus ancienne que j'ai est 1.0. Même alors existait $installer = $this;
. Même dans les fichiers nommés upgrade-0.x.y-0.z.t
cette ligne existe.
A mon avis, quand ils ont commencé (je la version moyenne 0.1 ou quelque chose comme ça), ils avaient quelque chose comme $installer = new Something()
et ils ont décidé de changer la logique.
Je suppose que cela à cause de la balise <class>
dans le config.xml
de certains modules (Mage_Catalog par exemple).
Versions avant 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 $this
au lieu de $installer
et je n'ai pas eu aucun problème (si ce maters de quelque manière).
Ceci est une convention d'inconnu et peut-être douteuse présente logique puisque la première de 2007 version bêta publique ( Aperçu B1 0.6.12383 , connexion requise)
. Il est utilisé comme une convention pour faire en sorte que la classe qui exécute le code d'installation est toujours dans les scripts aliasé configuration. Par exemple, alors que les deux Enterprise_GiftWrapping
et modules Enterprise_Rma
ont leurs propres classes d'installation, ils ont chacun $installer
alias à une instance de Mage_Catalog_Model_Resource_Setup
lors de l'ajout des attributs à l'entité produit, par exemple:.
app / code / core / Enterprise / emballage cadeau / 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
Une chose que je comme sur l'utilisation $installer
que je veux vraiment ajouter est qu'il rend facile de le remplacer par quelque chose d'autre ou pour l'exécuter en dehors du champ de la classe.
1. Remplaçant:
$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 extérieur:
$ 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" }
Bien sûr, avec data-upgrade-0.1.1-0.1.2.php
ayant:
//$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);
On évite ainsi Fatal error: Using $this when not in object context
Je suppose que c'est des jours précédents ( Nous avons toujours fait comme ça Vous savez; -)