Zastosowanie instalatora $ v $ this w skryptach instalacyjnych

17

Ok, przy użyciu skryptów instalacyjnych wydaje się, że istnieje dziwna konwencja polegająca na użyciu następujących elementów:

$installer = $this;

Naprawdę nie rozumiem tego, ponieważ jest całkowicie zbędny.

Dlaczego nie użyć w $this->całym skrypcie?

Wszelkie pomysły dotyczące tego, dlaczego ta konwencja istnieje?

Marty Wallace
źródło
Otrzymuję ostrzeżenia o tym, że jest używany poza kontekstem obiektu w vscode. Masz pomysł, jak to naprawić?
Henry's Cat

Odpowiedzi:

11

Odpowiedź jest znacznie prostsza. W 2007 roku (i sądzę, że do 2009 roku, kiedy PhpStorm zaczął się bujać) nikt nie mógł pozwolić na dostarczenie wbudowanego phpdoc $this. Ale główni programiści chcieli mieć autouzupełnianie w IDE. Dlatego użyli tych 2 linii:

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

Niektóre moduły mają własną klasę instalacyjną i powinny być użyte w wbudowanym phpdoc. Ale ponieważ skrypt instalacyjny / aktualizacyjny był (i jest) zawsze tworzony poprzez „skopiuj / wklej istniejący i zmień”, możesz znaleźć przykłady, gdy moduł ma własną klasę instalacyjną (lub używa modelu instalacyjnego eav Mage_Eav_Model_Entity_Setup), ale Mage_Catalog_Model_Resource_Setupjest używany w wbudowanym phpdoc w aktualizacji scenariusz.

Dmytro Zavalkin
źródło
8

Najstarsza wersja, którą mam, to 1.0. Nawet wtedy $installer = $this;istniało. Nawet w plikach o nazwie upgrade-0.x.y-0.z.tta linia istnieje.

Moim zdaniem, kiedy zaczęli (mam na myśli wersję 0.1 lub coś w tym stylu), mieli coś takiego $installer = new Something()i postanowili zmienić logikę.
Zakładam to ze względu na <class>znacznik w config.xmlniektórych modułach (na przykład Mage_Catalog). Wersje przed 1.6:

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

Lub w wersjach 1.6+:

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

Zwykle używam $thiszamiast $installeri nie miałem żadnego problemu (jeśli to w jakikolwiek sposób ma znaczenie).

Marius
źródło
5

Jest to konwencja o nieznanej i prawdopodobnie wątpliwej logice obecna od najwcześniejszej publicznej wersji beta z 2007 roku (wersja zapoznawcza B1 0.6.12383 ; wymagane logowanie).

Jest używany jako konwencja, aby zapewnić, że klasa, która wykonuje kod instalacyjny, jest konsekwentnie aliasowana w skryptach instalacyjnych. Na przykład, chociaż oba moduły Enterprise_GiftWrappingi Enterprise_Rmamają swoje własne klasy konfiguracji, każdy z nich jest aliasem $installerdo wystąpienia Mage_Catalog_Model_Resource_Setuppodczas dodawania atrybutów do encji produktu, np .:

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
zalety
źródło
4

Jedną z rzeczy, które lubię w używaniu $installer, którą naprawdę chcę dodać, jest to, że ułatwia to zastąpienie go czymś innym lub uruchomienie go poza zakresem klasy.


1. Wymiana:

$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. Poza zakresem:

$ php -a
php> requ_once 'app / Mage.php';
php> Mage :: init ();
php> wymagają 'app / code / local / Vendor / Module / data / vendormodule_setup / data-upgrade-0.1.1-0.1.2.php';
Upgrade działał!
Zrzut danych debugowania: tablica (4) {
  „id” =>
  int (123)
  „foo” =>
  string (3) „bar”
}

Oczywiście data-upgrade-0.1.1-0.1.2.phpmając:

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

To zapobiega Fatal error: Using $this when not in object context

7ochem
źródło
$ installer = Mage :: getSingleton ('eav / entity_setup', 'eav_setup'); należy pamiętać ... Nie jesteś ograniczony tylko do Mage :: getResourceModel („katalog / konfiguracja” ...
CarComp
3

Sądzę, że pochodzi on z wcześniejszych dni (<v.1.1). Ale szczerze mówiąc, nie mam pojęcia. Myślę, że jest to trochę lepiej czytelne ...

Zawsze tak robiliśmy

Wiesz ;-)

Fabian Blechschmidt
źródło
Nie sądzę, żeby miało to sens w żadnym kodzie PHP OOP, ale początkowo też go użyłem. W pewnym momencie całkowicie zignorowałem tę część i nigdy nie miałem żadnego problemu. Z mojego doświadczenia wynika, że ​​możesz bezpiecznie zignorować ten kod.
Petar Dzhambazov
Tak, też tak myślę. Jestem przyzwyczajony do tego ...
Fabian Blechschmidt