Uso de $ installer v $ this nos scripts de instalação


17

Ok, usando scripts de instalação, parece haver uma convenção estranha para usar o seguinte:

$installer = $this;

Eu realmente não entendo isso, pois é completamente redundante.

Por que não usar apenas $this->o script?

Alguma idéia de por que essa convenção existe?


Recebo avisos sobre isso ser usado fora do contexto do objeto no vscode. Alguma idéia de como eu conserto isso?
Henry's Cat

Respostas:


11

A resposta é muito mais simples. Em 2007 (e acredito que até 2009, quando o PhpStorm começou a balançar), nenhum IDE permitia fornecer phpdoc embutido $this. Mas os desenvolvedores principais queriam ter autocompletar no IDE. É por isso que eles usaram essas 2 linhas:

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

Alguns módulos possuem classe de configuração própria e deveriam ter sido usados ​​no phpdoc embutido. Mas como o script setup / upgrade sempre foi criado (e é) via "copie / cole um existente e altere", você pode encontrar alguns exemplos quando o módulo possui uma classe de instalação própria (ou usa o modelo de instalação eav Mage_Eav_Model_Entity_Setup), mas Mage_Catalog_Model_Resource_Setupé usado no phpdoc embutido na atualização roteiro.


8

A versão mais antiga que tenho é 1.0. Mesmo assim $installer = $this;existia. Mesmo nos arquivos nomeados upgrade-0.x.y-0.z.testa linha existe.

Na minha opinião, quando eles começaram (quero dizer a versão 0.1 ou algo parecido) eles tinham algo parecido $installer = new Something()e decidiram mudar a lógica.
Eu assumo isso por causa da <class>tag no config.xmlde alguns módulos (Mage_Catalog por exemplo). Versões anteriores à 1.6:

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

Ou nas versões 1.6+:

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

Eu costumo usar em $thisvez de $installere não tive nenhum problema (se isso é de alguma forma).


5

Esta é uma convenção de lógica desconhecida e possivelmente duvidosa presente desde a versão beta pública mais antiga de 2007 ( visualização B1 0.6.12383 ; é necessário fazer login).

É usado como uma convenção para garantir que a classe que está executando o código de instalação seja constantemente aliasada nos scripts de instalação. Por exemplo, enquanto os módulos Enterprise_GiftWrappinge Enterprise_Rmatêm suas próprias classes de configuração, cada $installerum deles é alias para uma instância Mage_Catalog_Model_Resource_Setupao adicionar atributos à entidade do produto, por exemplo:

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

4

Uma coisa que gosto de usar $installerque realmente quero adicionar é que facilita a substituição por outra coisa ou a execução fora do escopo da classe.


1. Substituindo-o:

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

$ php -a
php> require_once 'app / Mage.php';
php> Mage :: init ();
php> requer 'app / code / local / Vendor / Module / data / vendormodule_setup / data-upgrade-0.1.1-0.1.2.php';
A atualização funcionou!
Depurar dados dump: array (4) {
  'id' =>
  int (123)
  'foo' =>
  string (3) "barra"
}

Claro que com data-upgrade-0.1.1-0.1.2.php:

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

Então isso impede Fatal error: Using $this when not in object context


$ installer = Mage :: getSingleton ('eav / entity_setup', 'eav_setup'); É importante lembrar ... Você não está limitado a apenas Mago :: getResourceModel ( 'catálogo / setup' ...
CarComp

3

Eu acho que é de dias anteriores (<v.1.1). Mas, para ser sincero, não faço ideia. Eu acho que é um pouco melhor de ler ...

Sempre fizemos assim

Você sabe ;-)


Eu não acho que faz muito sentido em qualquer código PHP OOP, mas usei inicialmente também. Então, em algum momento, ignorou completamente essa parte e nunca teve nenhum problema. Portanto, minha experiência é que você pode ignorar com segurança esse código.
Petar Dzhambazov

Sim, eu também acho. Eu só estou acostumado a isso ...
Fabian Blechschmidt
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.