البرنامج التعليمي لإطار عمل PHP MVC
⚡ ملخص ذكي
يفصل تصميم إطار عمل PHP MVC بيانات التطبيق ومنطق الأعمال عن العرض التقديمي، باستخدام النماذج والعروض ووحدات التحكم. Codeيجعل Igniter هذا النمط عمليًا، مما يسمح لمطوري PHP ببناء تطبيقات ويب آمنة وقابلة للصيانة بشكل أسرع.
ما هو إطار عمل 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 الشائعة والميزات التي يقدمها كل إطار عمل.
| الإطار | الوصف |
|---|---|
|
|
يُعدّ أحد أشهر أطر عمل PHP MVC، وهو الآن في إصداره الرئيسي الرابع (Codeإغنايتر 4). يتميز بخفته وسهولة تعلمه. يحتوي على مجموعة غنية من المكتبات التي تساعد في بناء مواقع الويب والتطبيقات بسرعة. يمكن للمستخدمين ذوي المعرفة المحدودة ببرمجة الكائنات استخدامه أيضًا. التطبيقات المبنية باستخدام Codeيشمل جهاز الإشعال ما يلي:
|
|
إنه إطار عمل آمن وخفيف الوزن يعتمد على نموذج عرض التحكم الهرمي (HMVC). ملاحظة: تم إيقاف تطوير كوهانا رسميًا في عام 2017؛ وكان آخر إصدار مستقر لها هو 3.3.6 (يوليو 2016). واستمرت النسخة المعدلة من كوسيفين، التي طورها المجتمع، في استخدام قاعدة بياناتها. ومن بين الشركات التي استخدمت كوهانا: |
|
تم تصميمه على غرار Ruby on Rails ولا يزال يحظى بدعم مستمر (الإصدار 5.x). وهو معروف بمفاهيم مثل أنماط تصميم البرمجيات، وتفضيل الاتفاقيات على التكوين، وActiveRecord، وغيرها. للكيك تشمل التطبيقات التي تعمل بالطاقة؛ |
|
|
إنه إطار قوي؛
إنه مثالي للتطويرping تطبيقات الأعمال. في عام 2020، انتقل إطار عمل Zend إلى مشروع Laminas مفتوح المصدر. تشمل التطبيقات التي تعمل بنظام Zend/Laminas ما يلي:
تشمل الشركات التي استخدمت إطار عمل Zend ما يلي:
|
إطار عمل 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 أعلاه تثبيت الإطار بشكل صحيح. سنقوم الآن بنقل تطبيق استطلاع الرأي الخاص بنا إلى Codeالمُشغِّل. تذكر أن تطبيقنا كان مقسمًا إلى ثلاثة مكونات رئيسية، وهي:
- وحدة التحكم الأمامية - هذا هو الجزء الذي يستجيب لـ URL يقوم هذا الكود بطلب الصفحة المطلوبة وإعادتها. سيتم وضع هذا الكود في وحدة التحكم.
- النموذج - هذا هو الكود الذي يستجيب لطلبات البيانات ويعيد البيانات المطلوبة. سيتم وضع هذا الكود في النموذج.
- طرق العرض – هذا هو الكود المسؤول عن تنسيق البيانات وعرضها. سوف يذهب هذا الرمز إلى العرض
إعدادات تكوين قاعدة البيانات
لتكوين اتصال قاعدة البيانات:
- انتقل إلى مجلد ciopinionpoll
- فتح قاعدة البيانات. php الملف موجود في مجلد application/config.
- حدد أسطر التعليمات البرمجية التالية
- اضبط اسم المستخدم على الجذر
- قم بتعيين كلمة المرور لتكون كلمة مرور المستخدم الجذر على جهازك المحلي
- قم بتسمية قاعدة البيانات باسم 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/
صفحة التصويت أعلاه مأخوذة من عرض "opion_poll_form". انقر على "موافق" دون تحديد أي خيار، وستظهر لك رسالة التنبيه التالية.
صوّت لمكتبتك المفضلة، ثم انقر على "موافق". ستظهر لك صفحة النتائج التالية.
وهذا يؤكد أن الطبقات الثلاث تعمل معًا: فقد استقبل المتحكم التصويت، وقام النموذج بتخزينه وحسابه، وعرضت الواجهة المجاميع.









