我一直认为这是某种流行病,用户的行为方式是高风险的介绍 $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 对于 PK 列。(类似于它的处理方式 core_store 表中)。

endSetup 只是逆转了效果 startSetup.

许可以下: CC-BY-SA归因
scroll top