Verwendung von überflüssigem (und potenziell gefährlichem) Standardcode in Installationsskripten
-
13-12-2019 - |
Frage
Ich habe immer gedacht, dass es sich um eine Art epidemische Seuche handelt, die durch Benutzerverhalten mit hohem Risiko verursacht wird $installer->startSetup()
Und $installer->stopSetup()
Aufrufe in Installationsskripten.
Viele der angegebenen Beispielcodes (hier und auf anderen Websites finden Sie sie auch in vielen Erweiterungen, die Sie herunterladen können) enthalten Installationsskripte, die mit Folgendem beginnen:
<?php
$installer = $this;
$installer->startSetup();
# some or many lines of code that do not
# need $installer->startSetup(); at all for sure
#
# ...
#
$installer->endSetup();
Ich hatte immer den Eindruck, dass dies eine schlechte Praxis ist und insbesondere nicht in Beispielcode verwendet werden sollte, da dadurch das Risiko besteht, dass unnötige Daten verloren gehen $installer->endSetup();
Dies führt nach der Einrichtung zu einer inkonsistenten Datenbankkonfiguration, die die gesamte Installation gefährden kann.
Meine Frage ist also: Ist das so?Ist dies ein klarer Fall für den Ratschlag, diese Methoden nicht zu verwenden, es sei denn, Sie sind 100 % sicher, dass Sie sie benötigen?
Ich habe das Gefühl, dass diese immer eingefügt werden, weil die Autorin nicht weiß, wofür sie sind, aber sie meint, dass es da sein muss, es ist cool, sie zu verwenden, es kann nicht schaden und weil es sowieso funktioniert, ist es riskant, damit weiterzumachen üben.
Ich dachte auch darüber nach, vielleicht nach Meta zu fragen, denn als ich heute früher Änderungen vorschlug, schienen viele Benutzer, wie ich im Feedback in der Rezension gesehen habe, in diesem Punkt unsicher zu sein.Ich würde gerne etwas Klarstellung und Hinweise dazu sehen.
Lösung
Du hast 100 % Recht.Benutzen $installer->startSetup();
ist sehr gefährlich.
Insbesondere bei der Verwendung in Skripten, die Attribute entfernen.Ich habe das auf die harte Tour gelernt, als mein Attribut gelöscht wurde, die Werte für die Attribute jedoch als Zombie-Datensätze in der Datenbank zurückblieben.
Ich teile Ihre Annahme, dass dies geschieht, weil „sie es im Kern so machen“.
Hier gilt das Gleiche wie beim Einbinden
<all>
<title>Allow everything</title>
</all>
im ACL-Abschnitt und Hinzufügen einer Version zu den Layoutdateien <layout version="0.1.0">
.
aber das startSetup kann tatsächlich Schaden anrichten.Die anderen beiden „Traditionen“, die ich erwähnt habe, sind harmlos.
Nur um es anderen klar zu machen, die hier landen.
startSetup
führt die folgenden Abfragen aus
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'
Das bedeutet, dass die FK-Prüfungen deaktiviert sind und Sie den Wert eingeben können 0
für Spalten, die PKs sind.(Ähnlich wie es mit dem gemacht wird core_store
Tabelle in ).
endSetup
kehrt nur die Auswirkungen von um startSetup
.