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.