Использование лишнего (и потенциально опасного) стандартного кода в скриптах установщика.

magento.stackexchange https://magento.stackexchange.com//questions/68387

Вопрос

Я всегда думал, что это какая-то эпидемия, которую пользователи ведут себя очень рискованно. $installer->startSetup() и $installer->stopSetup() вызовы в сценариях установщика.

Многие из приведенных примеров кода (здесь и на других сайтах, вы также найдете его во многих расширениях, которые вы можете скачать) содержат сценарии установки, начинающиеся с:

<?php

$installer = $this;

$installer->startSetup();

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

$installer->endSetup();

У меня всегда сложилось впечатление, что это плохая практика и ее не следует использовать в примерах кода, поскольку это сопряжено с риском ненужной потери данных. $installer->endSetup(); что приводит к несогласованной конфигурации базы данных после установки, что может поставить под угрозу всю установку.

Итак, мой вопрос: это так?Является ли это кристально ясным случаем, чтобы дать совет не использовать эти методы, если вы не уверены на 100%, что они вам нужны?

У меня такое ощущение, что они всегда вставляются, потому что автор не знает, для чего они нужны, но она считает, что они должны быть там, их круто использовать, это не повредит, и, поскольку это все равно работает, продолжает этот рискованный упражняться.

Я также подумал, возможно, спросить о мета-версии, потому что, когда я предложил изменения ранее сегодня, судя по тому, что я вижу в отзывах в обзоре, многие пользователи, похоже, не уверены в этом вопросе.Я хотел бы увидеть некоторые разъяснения и ссылки по этому поводу.

Это было полезно?

Решение

Вы на 100% правы.С использованием $installer->startSetup(); очень опасно.
Особенно при использовании его в сценариях, удаляющих атрибуты.Узнал это на собственном горьком опыте, когда мой атрибут был удален, но значения атрибутов остались в виде зомби-записей в базе данных.
Я разделяю ваше предположение, что это сделано потому, что «в ядре так делают».
Это то же самое, что и для включения

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

в разделе ACL и добавление версии в файлы макета <layout version="0.1.0">.

но startSetup действительно может нанести некоторый ущерб.остальные две «традиции», о которых я упомянул, безвредны.

Просто чтобы прояснить ситуацию для других людей, которые в конечном итоге здесь оказываются.
startSetup запускает следующие запросы

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'

Это означает, что проверки FK отключены, и вы можете вставить значение 0 для столбцов, которые являются ПК.(аналогично тому, как это делается с core_store таблица в).

endSetup просто отменяет последствия startSetup.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top