استخدام تعليمات برمجية قياسية غير ضرورية (وربما خطيرة) في البرامج النصية للتثبيت

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 للأعمدة التي هي PKs.(على غرار الطريقة التي يتم بها core_store الجدول في).

endSetup فقط يعكس آثار startSetup.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى magento.stackexchange
scroll top