البرنامج التعليمي لإطار عمل PHP MVC

⚡ ملخص ذكي

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

  • 🧩 نمط: يقوم نمط MVC بتقسيم التطبيق إلى نموذج (بيانات)، وعرض (تقديم)، ووحدة تحكم (معالجة الطلبات) للحصول على كود أكثر وضوحًا.
  • 🚀 الإنتاجية: توفر الأطر المكتبية مكتبات جاهزة للوصول إلى قواعد البيانات والتحقق من صحتها وتنظيف المدخلات، مما يسمح للفرق بتقديم الميزات بشكل أسرع.
  • 🛠️ خيارات: Codeلا تزال Igniter و CakePHP و Laminas (المعروفة سابقًا باسم Zend) خيارات نشطة، بينما تم إيقاف Kohana في عام 2017.
  • 🗄️ طراز: In Codeفي Igniter، تمتد النماذج من CI_Model وتستخدم أساليب Query Builder لإجراء عمليات آمنة على قاعدة البيانات.
  • 🎮 المراقب: تقوم وحدات التحكم بتوسيع CI_Controller، وقراءة مدخلات المستخدم من خلال فئة الإدخال، وتحميل العرض الصحيح.
  • 📈 تأثير: يوضح نقل تطبيق استطلاع رأي بسيط مكتوب بلغة PHP كيف يقلل هيكل MVC من التكرار ويبسط الصيانة على المدى الطويل.

إطار عمل PHP MVC

ما هو إطار عمل PHP MVC؟

PHP MVC هو نمط تصميم تطبيق يفصل بين بيانات التطبيق ومنطق الأعمال (النموذج) عن العرض التقديمي (العرض). يرمز MVC إلى النموذج والعرض ووحدة التحكم.

وحدة التحكم تتوسط بين النماذج ووجهات النظر.

فكر في نمط تصميم MVC كسيارة وسائق.

تحتوي السيارة على الزجاج الأمامي (الرؤية) الذي يستخدمه السائق (المتحكم) لمراقبة حركة المرور في الأمام، ثم يقوم بزيادة السرعة أو الكبح (النموذج) اعتمادًا على ما يراه في الأمام.

والآن، دعونا نرى لماذا يستحق استخدام إطار عمل مبني على هذا النمط.

لماذا نستخدم PHP MVC Framework؟

تعمل أطر عمل PHP MVC على تبسيط العمل مع التقنيات المعقدة من خلال:

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

نمط تصميم PHP MVC

دعونا الآن نناقش بإيجاز كل مكون من مكونات نمط تصميم MVC.

الموديل – يهتم هذا الجزء بمنطق الأعمال وبيانات التطبيق. يمكن استخدامه لإجراء التحقق من صحة البيانات ومعالجة البيانات وتخزينها. يمكن أن تأتي البيانات من؛

  • ملف ثابت
  • قاعدة بيانات
  • مستند XML
  • مصادر بيانات صالحة أخرى.

مراقب – هذا هو الجزء الذي يتعامل مع طلبات المستخدم للحصول على الموارد من الخادم.

على سبيل المثال، عندما يطلب المستخدم URL …/index.php?products=listسيقوم المتحكم بتحميل نموذج المنتجات لاسترداد بيانات المنتجات، ثم يعرض النتائج في عرض القائمة.

باختصار، تقوم وحدة التحكم بربط النماذج وطرق العرض معًا اعتمادًا على الموارد المطلوبة.

المشاهدات – يتناول هذا الجزء عرض البيانات للمستخدم. وعادةً ما يكون ذلك على شكل صفحات HTML.

أنواع إطار عمل PHP MVC

يعد اختيار أفضل إطار عمل PHP تحديًا.

ليس عليك كتابة إطار العمل الخاص بك للاستفادة من مزايا MVC.

يجب عليك فقط محاولة إنشاء تصميم التطبيق الخاص بك المتعلق بـ MVC لفهم كيفية عمل أطر عمل MVC.

بمجرد أن تصبح مرتاحًا للطريقة التي تعمل بها أطر عمل MVC، يجب عليك الانتقال إلى أطر العمل الناضجة والمختبرة بالفعل.

يصف الجدول أدناه بإيجاز بعض أطر عمل PHP الشائعة والميزات التي يقدمها كل إطار عمل.

الإطار الوصف

Codeأنبوب


Codeأنبوب


https://codeigniter.com/

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


كوهانا


كوهانا


http://kohanaframework.org

إنه إطار عمل آمن وخفيف الوزن يعتمد على نموذج عرض التحكم الهرمي (HMVC). ملاحظة: تم إيقاف تطوير كوهانا رسميًا في عام 2017؛ وكان آخر إصدار مستقر لها هو 3.3.6 (يوليو 2016). واستمرت النسخة المعدلة من كوسيفين، التي طورها المجتمع، في استخدام قاعدة بياناتها. ومن بين الشركات التي استخدمت كوهانا:


للكيك


للكيك


www.cakephp.org

تم تصميمه على غرار Ruby on Rails ولا يزال يحظى بدعم مستمر (الإصدار 5.x). وهو معروف بمفاهيم مثل أنماط تصميم البرمجيات، وتفضيل الاتفاقيات على التكوين، وActiveRecord، وغيرها. للكيك تشمل التطبيقات التي تعمل بالطاقة؛


زند

https://getlaminas.org/


زيند (الآن لاميناس)

إنه إطار قوي؛

  • آمنة وموثوقة وسريعة وقابلة للتطوير
  • يدعم إنشاء خدمات الويب وواجهات برمجة التطبيقات (APIs).

إنه مثالي للتطويرping تطبيقات الأعمال. في عام 2020، انتقل إطار عمل Zend إلى مشروع Laminas مفتوح المصدر. تشمل التطبيقات التي تعمل بنظام Zend/Laminas ما يلي:

  • بيمكور سي إم إس,
  • دوتكيرنيل.

تشمل الشركات التي استخدمت إطار عمل Zend ما يلي:

  • بي بي سي
  • Cisco
  • يبكس
  • Offers.com

إطار عمل PHP MVC مقابل PHP العادي: الاختلافات الرئيسية

ما الذي يُغيّره إطار العمل فعليًا في التطبيق؟ يمنحك PHP العادي حريةً كاملة، لكن كل مشروع ينتهي بإعادة ابتكار التوجيه والتحقق من الصحة والوصول إلى قواعد البيانات من الصفر. يُوحّد إطار عمل PHP MVC هذه المهام المتكررة، مما يضمن اتساق الكود عبر المشاريع والفرق.

البعد لغة PHP البسيطة إطار عمل PHP MVC
Code منظمة مزيج من HTML وSQL والمنطق في ملفات منفردة مقسمة إلى نماذج، وعروض، ووحدات تحكم
الوصول إلى قاعدة البيانات استفسارات مكتوبة بخط اليد في كل صفحة أداة إنشاء استعلامات مدمجة أو نظام إدارة علاقات الكائنات مع ربط المعلمات
الأمن والحماية يجب على المطور أن يتذكر كل إجراءات الحماية تتضمن هذه الميزات تصفية المدخلات، والحماية من هجمات XSS، والحماية من هجمات CSRF.
الدورية تنتشر التغييرات بشكل غير متوقع عبر الملفات يمكن لكل طبقة أن تتغير بشكل مستقل

؟؟؟؟ تلميح: قم ببناء مشروع PHP بسيط صغير أولاً، مثل استطلاع الرأي أدناه؛ إن معاناة الكود المختلط تجعل قيمة فصل MVC واضحة.

نقل تطبيق استطلاع الرأي إلى Codeأنبوب

في هذا البرنامج التعليميلقد أنشأنا تطبيق استطلاع رأي باستخدام لغة PHP. سنقوم هنا بنقل هذا الكود إلى Codeأنبوب

  • التحميل أحدث إصدار من Codeمشعل من خاصتهم موقع الكتروني.
  • Extracانقل محتويات الملف المضغوط إلى مجلد التطوير الخاص بك في مجلد خادم الويب. سنستخدم اسم المجلد ciopinionpoll في هذا الدرس.
  • استعرض للوصول إلى URL http://localhost/ciopinionpoll/

Codeتظهر صفحة الترحيب الخاصة بـ Igniter بعد extracوضع الإطار

استخدم Codeتؤكد صفحة الترحيب الخاصة بـ Igniter أعلاه تثبيت الإطار بشكل صحيح. سنقوم الآن بنقل تطبيق استطلاع الرأي الخاص بنا إلى Codeالمُشغِّل. تذكر أن تطبيقنا كان مقسمًا إلى ثلاثة مكونات رئيسية، وهي:

  • وحدة التحكم الأمامية - هذا هو الجزء الذي يستجيب لـ URL يقوم هذا الكود بطلب الصفحة المطلوبة وإعادتها. سيتم وضع هذا الكود في وحدة التحكم.
  • النموذج - هذا هو الكود الذي يستجيب لطلبات البيانات ويعيد البيانات المطلوبة. سيتم وضع هذا الكود في النموذج.
  • طرق العرض – هذا هو الكود المسؤول عن تنسيق البيانات وعرضها. سوف يذهب هذا الرمز إلى العرض

إعدادات تكوين قاعدة البيانات

لتكوين اتصال قاعدة البيانات:

  • انتقل إلى مجلد ciopinionpoll
  • فتح قاعدة البيانات. php الملف موجود في مجلد application/config.
  • حدد أسطر التعليمات البرمجية التالية

إعدادات تكوين قاعدة البيانات في Codeملف قاعدة بيانات Igniter.php

  • اضبط اسم المستخدم على الجذر
  • قم بتعيين كلمة المرور لتكون كلمة مرور المستخدم الجذر على جهازك المحلي
  • قم بتسمية قاعدة البيانات باسم opinion_poll. لاحظ أننا سنستخدم قاعدة البيانات التي تم إنشاؤها في الدرس السابق.
  • احفظ التغييرات وأغلق الملف.

خلق نموذجنا

سنقوم الآن بإنشاء نموذجنا الذي سيمتد من نموذج CI_Model. يُعد نموذج CI_Model جزءًا من Codeمكتبات Igniter. سيتم وضع النموذج في مجلد application/models review_poll_model.php

<?php
class Opinion_poll_model extends CI_Model
{
    public function __construct()
    {
        parent::__construct();
        $this->load->database();
    }

    public function total_votes()
    {
        $query = $this->db->select('COUNT(choice) as choices_count')->get('js_libraries');
        return $query->row()->choices_count;
    }

    public function get_results()
    {
        $libraries = array("", "JQuery", "MooTools", "YUI Library", "Glow");
        $table_rows = '';

        for ($i = 1; $i < 5; $i++)
        {
            $query = $this->db->select('COUNT(choice) as choices_count')
                              ->where('choice', $i)
                              ->get('js_libraries');

            $table_rows .= "<tr><td>" . $libraries[$i] . " Got:</td><td><b>" . $query->row()->choices_count . "</b> votes</td></tr>";
        }

        return $table_rows;
    }

    public function add_vote($choice)
    {
        $ts = date("Y-m-d H:i:s");
        $data = array('choice' => $choice, 'ts' => $ts);
        $this->db->insert('js_libraries', $data);
    }
}
?>

هنا،

  • "فئة Opinion_poll_model تمتد إلى CI_Model..." هو نموذجنا الذي يمتد إلى CI_Model
  • يستدعي "parent::__construct();" مُنشئ CI_Model
  • "$هذا->تحميل->قاعدة البيانات ()؛" يقوم بتحميل مكتبة قاعدة البيانات حتى يتمكن تطبيقنا من التفاعل مع قاعدة البيانات
  • "$this->db->" هو Codeسجل إغنايتر النشط. تحقق من هذا الصفحة لمزيد من المعلومات حول السجل النشط.

إنشاء وحدة التحكم الخاصة بنا

لنقم الآن بإنشاء وحدة التحكم. سنستخدم الإعدادات الافتراضية. Codeيوجد ملف التحكم الخاص بـ Igniter في المسار application/controllers/welcome.php. استبدل الكود المصدري الخاص به بالكود التالي.

<?php

if (!defined('BASEPATH'))  exit('No direct script access allowed');

class Welcome extends CI_Controller {

    public function __construct() {

        parent::__construct();

        $this->load->model('opinion_poll_model');

    }

    public function index() {

        if ($this->input->post('submitbutton') && !$this->input->post('vote')) {

            echo "<script>alert('You did not vote!');</script>";

        }

        if ($this->input->post('vote')) {

            $this->opinion_poll_model->add_vote($this->input->post('vote'));

            $data['total_votes'] = $this->opinion_poll_model->total_votes();

            $data['rows'] = $this->opinion_poll_model->get_results();

            $this->load->view('results', $data);

        } else {

            $this->load->view('opinion_poll_form');

        }

    }

}

/* End of file welcome.php */

/* Location: ./application/controllers/welcome.php */
?>

هنا،

  • "إذا (! تعريف ('BASEPATH')) خروج ('لا يسمح بالوصول المباشر إلى البرنامج النصي')؛" يضمن عدم وصول المستخدمين مباشرة إلى فئة وحدة التحكم
  • "تمتد فئة الترحيب إلى CI_Controller..." تعمل وحدة التحكم الخاصة بنا على توسيع فئة CI_Controller
  • تقوم الدالة العامة "__construct()" باستدعاء دالة البناء الخاصة بفئة CI_Controller وتحميل نموذج Opinion_poll_model الخاص بنا
  • الدالة "public function index()…" هي الدالة التي تُشير إلى الملف index.php. وهي تستخدم Codeتستخدم فئة الإدخال في Igniter للتحقق من إرسال التصويت، وإضافته إلى قاعدة البيانات، ثم عرض النتائج. إذا كانت مصفوفة المنشورات في فئة الإدخال فارغة، فسيتم تحميل صفحة التصويت.
  • "$this->input->post('…')" هو Codeفئة إدخال Igniter التي تستخرج محتويات المتغير العام $_POST.
  • "$this->opinion_poll_model->add_vote($this->input->post('vote'))" يستدعي أسلوب add_vote الخاص بالنموذج لإضافة التصويت إلى قاعدة البيانات.

خلق وجهات نظرنا

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

opinion_poll_form.php
<html>
<head>
    <title>
        JavaScript Libraries - Opinion Poll
    </title>
</head>

<body>
    <h2>JavaScript Libraries - Opinion Poll</h2>
    <p><b>What is your favorite JavaScript Library?</b></p>
    <form method="POST" action="index.php">
        <p>
            <input type="radio" name="vote" value="1" /> JQuery
            <br />
            <input type="radio" name="vote" value="2" /> MooTools
            <br />
            <input type="radio" name="vote" value="3" /> YUI Library
            <br />
            <input type="radio" name="vote" value="4" /> Glow </p>
        <p>
            <input type="submit" name="submitbutton" value="OK" />
        </p>
    </form>
</body>
</html>

لنقم الآن بإنشاء صفحة النتائج results.php

<html>
    <head>
        <title>JavaScript Libraries - Opinion Poll Results</title>
    </head>
    <body>

        <h2>JavaScript Libraries - Opinion Poll Results</h2>

        <p><b>What is your favorite JavaScript Library?</b></p>

        <p><b><?php echo $total_votes; ?></b> people have thus far taken part in this poll:</p>

        <p><table><tr><td>

            <?php print($rows); ?>

        </tr></td></table></p>

        <p><a href="#">Return to voting page</a></p>
</body>
</html>

اختبار تطبيقنا

بافتراض أن الدليل الجذر لتطبيقك هو ciopinionpoll، انتقل إلى http://localhost/ciopinionpoll/

استمارة التصويت لاستطلاع الرأي مقدمة من Codeتطبيق الإشعال

صفحة التصويت أعلاه مأخوذة من عرض "opion_poll_form". انقر على "موافق" دون تحديد أي خيار، وستظهر لك رسالة التنبيه التالية.

تظهر رسالة تنبيه التحقق عند عدم تحديد أي صوت

صوّت لمكتبتك المفضلة، ثم انقر على "موافق". ستظهر لك صفحة النتائج التالية.

صفحة نتائج استطلاعات الرأي التي تعرض عدد الأصوات لكل Javaمكتبة البرامج النصية

وهذا يؤكد أن الطبقات الثلاث تعمل معًا: فقد استقبل المتحكم التصويت، وقام النموذج بتخزينه وحسابه، وعرضت الواجهة المجاميع.

الأسئلة الشائعة

يُنظّم نموذج HMVC (نموذج عرض تحكم هرمي) التطبيق إلى ثلاثيات MVC مستقلة يمكنها استدعاء بعضها البعض. أطر عمل مثل كوهانا لقد شاع استخدام HMVC لأنه يساعد في تقسيم التطبيقات الكبيرة إلى وحدات.

نعم. لارافل يُعد حاليًا إطار عمل PHP MVC الأكثر شيوعًا. وهو يتبع نفس فصل نموذج العرض والمتحكم الموصوف هنا، مع إضافة أدوات مثل Eloquent ORM وقوالب Blade.

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

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

رقم Codeأنبوب يُعدّ هذا النظام سهل الاستخدام للمطورين ذوي الخبرة المحدودة في البرمجة الكائنية التوجه. يكفي معرفة الفئات والأساليب والوراثة الأساسية لفهم أنماط النموذج والمتحكم فيه.

تلخيص هذه التدوينة بـ: