Pergunta

Sempre pensei que fosse algum tipo de praga epidêmica que os usuários se comportassem de maneira de alto risco introduzindo $installer->startSetup() e $installer->stopSetup() chamadas em scripts de instalação.

Muitos dos códigos de exemplo fornecidos (aqui e em outros sites, você também os encontra em muitas das extensões que podem ser baixadas) contêm scripts de instalação começando com:

<?php

$installer = $this;

$installer->startSetup();

# some or many lines of code that do not 
# need $installer->startSetup(); at all for sure
#
# ...
#

$installer->endSetup();

Sempre tive a impressão de que isso é uma prática ruim e, especificamente, não deveria ser usado em código de exemplo porque introduzia o risco de perder desnecessariamente $installer->endSetup(); resultando em uma configuração de banco de dados inconsistente após a instalação, o que pode colocar toda a instalação em risco.

Então minha pergunta é: é assim?Este é um caso claro para aconselhar a não usar esses métodos, a menos que você tenha 100% de certeza de que precisa deles?

Tenho a sensação que esses são sempre colocados porque a autora não sabe para que servem mas ela acha que precisa estar ali, é legal usar, não faz mal e porque funciona mesmo assim, continua com esse arriscado prática.

Também pensei em perguntar no meta porque quando sugeri edições hoje cedo, pelo que vi no feedback da revisão, muitos usuários parecem não ter certeza sobre esse ponto.Eu adoraria ver alguns esclarecimentos e referências sobre isso.

Foi útil?

Solução

Você está 100% certo.Usando $installer->startSetup(); é muito perigoso.
Principalmente ao usá-lo em scripts que removem atributos.Aprendi isso da maneira mais difícil, quando meu atributo foi excluído, mas os valores dos atributos foram deixados como registros zumbis no banco de dados.
Compartilho sua suposição de que isso é feito porque "é assim que eles fazem no núcleo".
É o mesmo para isso e para incluir

<all>
    <title>Allow everything</title>
</all> 

na seção ACL e adicionando uma versão aos arquivos de layout <layout version="0.1.0">.

mas o startSetup pode causar alguns danos.as outras 2 “tradições” que mencionei são inofensivas.

Só para deixar claro para outras pessoas que acabam aqui.
startSetup executa as seguintes consultas

SET SQL_MODE='';
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO'

Isso significa que as verificações FK estão desabilitadas e você pode inserir o valor 0 para colunas que são PKs.(semelhante a como é feito para o core_store tabela em ).

endSetup apenas reverte os efeitos startSetup.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top