كيف قررت كتابة ORM في php من البداية على موقع عمل ، وماذا أتى منها

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







المقدمة



الطريقة التي ننشئ بها تطبيقات الويب الآن مختلفة تمامًا عن الكود الذي جاء إلينا للحصول على الدعم من العصور القديمة ، عندما تم عرض Star Factory على التلفزيون ، كان من المألوف السير مع صدفي ، وكانت PHP قد بدأت للتو في الحصول على إشارات للغة كائنية التوجه. يبدو لي أن البرمجة في العقد الأول من القرن الحادي والعشرين كانت توضيحًا ممتازًا لأفكار داروين: في ذلك الوقت ، أنشأ أي مطور واحد تقريبًا حلوله الخاصة ، استحوذ بعضها على عقول أكثر من شخص واحد ، وبعد المرور بالانتقاء الطبيعي المتسارع ، أصبحت الأطر ونظام إدارة المحتوى (CMS) أمثلة عنوان لأفضل طرق التطوير وأكثرها شيوعًا ... في بعض الحالات ، مع ذلك ، فقط شعبية ، دون كلمة "جيد" أو حتى أكثر من ذلك "الأفضل".





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



إرث محبوب



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



print " <button onClick='domultimove();' class=controlbutton><img src=syspix/ico32_move.gif border=0><br></button>";
print "<b>" . $ITEM->Description . "</b>:<br>";
$browsebgcolor = "#D9D9D9";
$sql = "select i.ID, m.Name, i.perm, i.descr from item4 i inner join main m on i.ID=m.ElementID";
echo "<script language='JavaScript'> document.location='" . $_SERVER['PHP_SELF']";


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



لذلك ، لدي موقع على شبكة الإنترنت لشركة كبيرة ، كتب في النصف الأول من العقد الأول من القرن الحادي والعشرين. في هذا المشروع ، كان كل شيء يعتمد على فئات ذات طريقة واحدة ، حيث حدث كل شيء: العمل بالمنطق ، وعرض الواجهة (عرض) والوصول إلى قاعدة البيانات ، علاوة على ذلك ، كانت SQL موجودة بين الأوامر
print "<table>";
... بالمناسبة ، لم يكن إجراء تعديلات على موقع يعمل على مثل هذا الرمز ، مع حركة مرور جيدة ومكون تجاري ، أكثر الأحداث متعة ، ولكنه حدث ممتع للغاية.





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





بعد النظر إلى Symphony و Laravel ، قررت أن نهج ORM سيكون مناسبًا تمامًا هنا أيضًا. سيساعد ذلك على تنفيذ العمل مع قاعدة البيانات ويترك في الوقت الحالي يعمل غير المراقبين فقط مع البيانات التي تم تلقيها بالفعل. من المنطقي والصحيح تمامًا استخدام الحلول الحالية. لذلك ، أولاً وقبل كل شيء ، هرعت إلى عامل التعبئة لمعرفة البدائل المتاحة لي إلى جانب العقيدة ، ولكن بعد التفكير مليًا ، توصلت إلى نتيجة مخيبة للآمال مفادها أنها ليست مهمة جدًا. النقطة المهمة هي أن هذا المشروع كان له بنية بيانات غير عادية إلى حد ما. لم أر مثل هذا الشيء في أي مكان آخر ، على الرغم من أنني عملت مع MODx :) واجهت مشكلة: استخدام ORMs الشعبية مفتوحة المصدر بالطريقة التي أريدها لن ينجح ، حسنًا ، على الأقل سيكون مغامرة أخرى. لذلك قررت أن أصنع دراجة.



قليلا عما فعلته





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





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



ORM



كما ترى من الشجرة ، أضفت أيضًا دعمًا لأنواع مختلفة من قواعد البيانات ، وهو أمر لا لزوم له في هذه الحالة. لكن في تلك اللحظة دخلت إلى "الدفق" وأنشأت :). أيضًا ، كانت الخطوة الصحيحة جدًا في هذه الحالة هي أنني قمت بذلك على أساس PDO ، لأن php-mysql المستخدم في الكود لم يسمح بترجمة الموقع إلى الإصدار السابع من اللغة ، وأردت إصلاح هذا في الجذر ، كما يقولون.



$element = (new Model())->getOne($id);


نظرًا لحقيقة أنه كان لدي فهم جيد لمنطق بنية قاعدة البيانات ، فقد تمكنت من البحث عن مورد واسترداده فقط من خلال المعرف الخاص به ، دون معرفة نوع البيانات الداخلية التي يمتلكها المورد ، والتي كانت ضرورية مع النهج القديم. الكائن الحقيقي يعمل مع البيانات ، ونحن ننسى أمر SQL في الكود.





فقرات ختامية ...



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



ثانيًا ، لقد فعلت ذلك بسرعة كبيرة ، فالعديد من الشركات لا تحب ذلك عندما يقضي المبرمجون وقتًا في كل أنواع إعادة البناء غير المفهومة. لقد نفذت المشروع بأكمله في غضون أسبوع تقريبًا ، بينما أقوم في نفس الوقت بمهام تنفيذ الميزات الجديدة.



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



All Articles