سؤال

هل هناك طريقة بسيطة لكتابة دالة مشتركة لكل من CRUD (create, retreive, update, delete) العمليات في PHP دون استخدام أي إطار.على سبيل المثال، أرغب في الحصول على وظيفة إنشاء واحدة تأخذ اسم الجدول وأسماء الحقول كمعلمات وتقوم بإدراج البيانات في ملف mySQL database.الشرط الآخر هو أن الوظيفة يجب أن تكون قادرة على دعم الصلات، على سبيل المثال.يجب أن يكون قادرًا على إدراج البيانات في جداول متعددة إذا لزم الأمر.

أعلم أنه يمكن تنفيذ هذه المهام باستخدام إطار عمل ولكن لأسباب مختلفة - طويلة جدًا بحيث لا يمكن شرحها هنا - لا يمكنني استخدامها.

هل كانت مفيدة؟

المحلول

لقد كتبت هذا الشيء بالذات، إنه نوع من السقالة المصقولة.إنها في الأساس فئة يأخذ منشئها الجدول المراد استخدامه، ومصفوفة تحتوي على أسماء الحقول وأنواعها، وإجراء.بناءً على هذا الإجراء، يستدعي الكائن طريقةً على نفسه.على سبيل المثال:

هذه هي المصفوفة التي أمررها:

$data = array(array('name' => 'id', 'type' => 'hidden')
          , array('name' => 'student', 'type' => 'text', 'title' => 'Student'));

ثم أتصل بالمنشئ:

new MyScaffold($table, 'edit', $data, $_GET['id']);

في الحالة المذكورة أعلاه، يستدعي المنشئ طريقة "تحرير" التي تقدم نموذجًا يعرض البيانات من الجدول $، ولكن فقط الحقول التي قمت بإعدادها في المصفوفة الخاصة بي.يتم تحديد السجل الذي يستخدمه بطريقة $_GET.في هذا المثال، يتم تقديم حقل "الطالب" كمربع نص (وبالتالي نوع "النص")."العنوان" هو ببساطة التسمية المستخدمة.كونه "مخفيًا"، لا يظهر حقل المعرف للتحرير ولكنه متاح للبرنامج للاستخدام.

إذا قمت بتمرير "حذف" بدلاً من "تحرير"، فسيؤدي ذلك إلى حذف السجل من متغير GET.إذا قمت بتمرير اسم جدول فقط، فسيتم تعيينه افتراضيًا على قائمة السجلات التي تحتوي على أزرار للتحرير والحذف والجديد.

إنها مجرد فئة واحدة تحتوي على كل CRUD مع الكثير من التخصيص.يمكنك جعل الأمر معقدًا أو بسيطًا كما يحلو لك.من خلال جعلها فئة عامة، يمكنني إدراجها في أي مشروع وتمرير التعليمات ومعلومات الجدول ومعلومات التكوين فقط.ربما لا أرغب في جدول واحد في السماح بإضافة سجلات جديدة من خلال السقالة، وفي هذه الحالة قد أقوم بتعيين "زر جديد" ليكون خطأ في مجموعة المعلمات الخاصة بي.

إنه ليس إطارًا بالمعنى التقليدي.مجرد فئة مستقلة تتعامل مع كل شيء داخليًا.هناك بعض العيوب في هذا.يجب أن تكون المفاتيح الأساسية هي أن جميع جداولي يجب أن تحتوي على مفتاح أساسي يسمى "المعرف"، ويمكنك الهروب بدونه ولكنه قد يؤدي إلى تعقيد الأمور.والأمر الآخر هو أنه يجب إعداد مصفوفة كبيرة تحتوي على معلومات تفصيلية حول كل جدول تريد إدارته، ولكنك تحتاج إلى القيام بذلك مرة واحدة فقط.

للحصول على برنامج تعليمي حول هذه الفكرة انظر هنا

نصائح أخرى

إذا حاولت كتابة مثل هذه الوظيفة فسوف تكتشف قريبًا أنك قد أدركت للتو إطار عمل آخر.

بالطبع لا، ولهذا السبب توجد تلك الأطر وتنفذ المرافق الأولية.سأحاول أولاً إقناع كل من يلزم باستخدام إطار عمل موجود فعليًا، وثانيًا، إذا فشلت في ما سبق، سألقي نظرة على واحد أو اثنين منهم ونسخ أفكار التنفيذ.فشل كل ما يمكنك إلقاء نظرة عليه http://www.phpobjectgenerator.com/

دون أي أطر يتضمن دون أي ORMs؟خلاف ذلك أود أن أقترح إلقاء نظرة على عقيدة أو دفع.

أنا أعرف الطريقة التي تشعر بها.

Pork.DbObject هي فئة بسيطة يمكنك من خلالها توسيع الكائنات الخاصة بك.إنه يحتاج فقط إلى فئة اتصال db للعمل.

ارحوك افحص:www.schizofreend.nl/pork.dbobject/

(أوه نعم، yuk @ php object generator. تنبيه الانتفاخ! من يريد الحصول على تلك الوظائف المخصصة في كل فصل؟؟؟)

أعتقد أنه يجب عليك كتابة الوظائف الخاصة بك التي تحقق CRUD ما لم تكن مرهقًا للوقت.قد يكون إطار عمل بمفرده ولكنك تحتاج إلى معرفة ما يفعله إطار العمل قبل صراخ إطار العمل.... يصبح من السهل أيضًا معرفة هذه الأشياء لأنه يمكنك بسهولة اكتشاف الأخطاء في إطار العمل وإصلاحها بنفسك.... ....

لقد صادفت هذا السؤال في SO منذ فترة وانتهى بي الأمر بعدم العثور على أي شيء في ذلك الوقت يفعل ذلك بطريقة خفيفة الوزن.

انتهى بي الأمر بكتابة كتابي الخاص، وقد قمت مؤخرًا بفتح مصدر له (ترخيص معهد ماساتشوستس للتكنولوجيا) في حال وجده الآخرون مفيدًا.إنه موجود على Github، فلا تتردد في التحقق منه واستخدامه إذا كان يناسب احتياجاتك!

https://github.com/ArthurD/php-crud-model-class

نأمل أن تجد بعض الاستخدام - أحب أن أرى بعض التحسينات/المساهمات، لذا لا تتردد في إرسال طلبات السحب!:-)

فمن الممكن ولكن لا أوصي به.

إذا لم تكن هناك طريقة على الإطلاق لاستخدام إطار عمل، فيمكنك إنشاء فئة أساسية تمتد إليها جميع كائنات النماذج الأخرى.يمكنك بعد ذلك جعل الفئة الأساسية تقوم بإنشاء وتنفيذ SQL بناءً على ذلك get_class() و get_class_vars().

هل هو ممكن؟نعم.
هل أوصي به؟لا

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