インストーラースクリプトでの余分な (そして潜在的に危険な) 標準コードの使用
-
13-12-2019 - |
質問
ユーザーがハイリスクな行動をとるのは、ある種の伝染病のようなものだと常々思っていました。 $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 は実際に何らかの損害を与える可能性があります。私が言及した他の 2 つの「伝統」は無害です。
ここに行き着く他の人のために明確にしておきます。
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
.