يعد نمط MVC شائعًا جدًا في بنية مواقع الويب. فهو يسمح لنا ببناء تطبيق من ثلاثة مستويات، وفصل الطبقات المفيدة عن التعليمات البرمجية، ومساعدة المصممين والمطورين على العمل معًا وتحسين قدرتنا على صيانة التطبيقات الحالية وتوسيعها.
يشير
"العرض" بشكل أساسي إلى النتيجة النهائية التي نرسلها إلى متصفح الويب - مثل HTML الذي تم إنشاؤه بواسطة البرنامج النصي الخاص بنا. عند الحديث عن طرق العرض، يفكر الكثير من الناس في القوالب، ولكن صحة استدعاء طرق عرض حلول القوالب أمر مشكوك فيه.
ربما يكون أهم شيء في طريقة العرض هو أنها يجب أن تكون "واعية بذاتها". عندما يتم تقديم طريقة العرض، تكون عناصرها على دراية بدورها في الإطار الأكبر.
بأخذ XML كمثال، يمكن القول أنه عندما يتم تحليل XML، فإن DOM API لديها معرفة بحيث تعرف العقدة في شجرة DOM مكانها وما تحتويه. (عندما يتم تحليل عقدة في مستند XML باستخدام SAX، يكون ذلك منطقيًا فقط عندما يتم تحليل العقدة.)
تستخدم معظم مخططات القوالب لغات إجرائية بسيطة وعلامات قالب مثل هذا:
<p>{some_text}</p >
<p>{some_more_text}</p>
ليس لها أي معنى في المستند، كل ما يقصدونه هو أن PHP ستستبدله بشيء آخر.
إذا وافقت على هذا الوصف الفضفاض لطرق العرض، فإنك توافق أيضًا على أن معظم حلول القوالب لا تفصل طرق العرض والنماذج بشكل فعال. سيتم استبدال علامة القالب بكل ما تم تخزينه في النموذج.
اطرح على نفسك بعض الأسئلة أثناء تنفيذ العرض: "هل من السهل استبدال العرض بأكمله؟" "كم من الوقت يستغرق تنفيذ عرض جديد؟" "هل من السهل استبدال لغة الوصف الخاصة بالعرض؟ (على سبيل المثال، باستخدام SOAP في نفس طريقة العرض، يحل المستند محل مستند HTML)"
النموذج (النموذج)
يمثل النموذج منطق البرنامج. (غالبًا ما تسمى طبقة الأعمال في البرامج على مستوى المؤسسة)
بشكل عام، تتمثل مهمة النموذج في تحويل البيانات الأصلية إلى بيانات تحتوي على بعض المعنى، والتي سيتم عرضها بواسطة العرض. عادةً ما يقوم النموذج بتغليف استعلامات البيانات، ربما من خلال بعض فئات البيانات المجردة (طبقة الوصول إلى البيانات) لتنفيذ الاستعلام. على سبيل المثال، إذا كنت ترغب في حساب هطول الأمطار السنوي في المملكة المتحدة (فقط لتجد لنفسك مكانًا رائعًا لقضاء العطلات)، فسيتلقى النموذج هطول الأمطار اليومي لمدة عشر سنوات، ويحسب المتوسط، ويمرره إلى العرض.
وحدة التحكم (وحدة التحكم)
تعني ببساطة أن وحدة التحكم هي الجزء الأول من طلب HTTP الوارد في تطبيق الويب. فهو يتحقق من الطلب المستلم، مثل بعض متغيرات GET، ويقدم الملاحظات المناسبة. من الصعب البدء في كتابة كود PHP آخر حتى تكتب وحدة التحكم الأولى الخاصة بك. الاستخدام الأكثر شيوعًا هو بنية تشبه عبارة التبديل في ملف Index.php:
<?php
التبديل ($_GET['صفحة العرض']) {
حالة "الأخبار":
$page=new NewsRenderer;
استراحة؛
حالة "الروابط":
$page=new LinksRenderer;
استراحة؛
تقصير:
$page=new HomePageRenderer;
استراحة؛
}
$page->display();
?>
يمزج هذا الرمز بين التعليمات البرمجية الإجرائية والموجهة للكائنات، ولكن بالنسبة للمواقع الصغيرة، عادةً ما يكون هذا هو الخيار الأفضل. على الرغم من أنه لا يزال من الممكن تحسين الكود أعلاه.
وحدات التحكم هي في الواقع عناصر تحكم تستخدم لتشغيل الارتباطات بين بيانات النموذج وعناصر العرض.
مثال
هنا مثال بسيط باستخدام نمط MVC.
نحتاج أولاً إلى فئة الوصول إلى قاعدة البيانات، وهي فئة عادية.
<?php
/**
* فئة بسيطة للاستعلام عن MySQL
*/
فئة الوصول إلى البيانات {
/**
*خاص
* يقوم $db بتخزين مورد قاعدة البيانات
*/
فار $ ديسيبل؛
/**
*خاص
* $query يخزن مورد استعلام
*/
var $query; // مورد الاستعلام
//!
/**
* إنشاء كائن DataAccess جديد
*param $اسم مضيف سلسلة المضيف لـ dbserver
*param $user string dbserver user
*param $pass string كلمة مرور مستخدم dbserver
*param $db اسم قاعدة بيانات السلسلة
*/
وظيفة DataAccess ($host,$user,$pass,$db) {
$this->db=mysql_pconnect($host,$user,$pass);
mysql_select_db($db,$this->db);
}
//!
/**
* جلب موارد الاستعلام وتخزينها في عضو محلي
* @param $sql سلسلة استعلام قاعدة البيانات المراد تشغيله
* @العودة فارغة
*/
جلب الدالة($sql) {
$this->query=mysql_unbuffered_query($sql,$this->db);
}
//!
/**
* إرجاع مصفوفة ترابطية لصف استعلام
* @العودة مختلطة
*/
وظيفة getRow () {
إذا ( $row=mysql_fetch_array($this->query,MYSQL_ASSOC))
إرجاع الصف $؛
آخر
عودة كاذبة.
}
}
>
ضع النموذج فوقه.
<?php
/**
* جلب "المنتجات" من قاعدة البيانات
*/
فئة المنتجنموذج {
/**
*خاص
* $dao مثيل لفئة DataAccess
*/
فار $داو
//!
/**
* إنشاء كائن ProductModel جديد
* @param $dbobject مثيل لفئة DataAccess
*/
وظيفة نموذج المنتج (&$dao) {
$this->dao=& $dao;
}
//!
/**
* يخبر $dboject بتخزين هذا الاستعلام كمورد
* @param $ ابدأ الصف الذي يبدأ منه
* @param $rows عدد الصفوف المراد جلبها
* @العودة فارغة
*/
قائمة الوظائفالمنتجات($start=1,$rows=50) {
$this->dao->fetch("SELECT * FROM Products LIMIT ".$start.", ".$rows);
}
//!
/**
* يخبر $dboject بتخزين هذا الاستعلام كمورد
* @param $id مفتاح أساسي للصف
* @العودة فارغة
*/
قائمة الوظائفالمنتج(معرف $) {
$this->dao->fetch("SELECT * FROM Products WHERE PRODUCTID='".$id."'");
}
//!
/**
* جلب منتج كمصفوفة ترابطية من $dbobject
* @العودة مختلطة
*/
وظيفة الحصول على المنتج () {
إذا ( $product=$this->dao->getRow() )
إرجاع منتج $؛
آخر
عودة كاذبة.
}
}
?>
هناك شيء واحد يجب ملاحظته وهو أن التفاعل بين النموذج وفئة الوصول إلى البيانات لا يزيد أبدًا عن سطر واحد - ولا يتم إرسال عدة أسطر، مما سيؤدي إلى إبطاء البرنامج بسرعة. يحتاج نفس البرنامج فقط إلى الاحتفاظ بصف واحد (صف) في الذاكرة للفئة التي تستخدم المخطط - يتم إعطاء الباقي لمورد الاستعلام المحفوظ (مورد الاستعلام) - بمعنى آخر، نسمح لـ MYSQL بالحفاظ على النتائج لنا.
التالي هو العرض - لقد قمت بإزالة HTML لتوفير المساحة، يمكنك التحقق من الكود الكامل في هذا المنشور.
<?php
/**
* ربط بيانات المنتج بعرض HTML
*/
فئة عرض المنتج {
/**
*خاص
* $model مثيل لفئة ProductModel
*/
فار $model
/**
*خاص
* يتم تخزين HTML الناتج $ هنا للعرض
*/
var $output;
//!
/**
* إنشاء كائن ProductView جديد
* @param $model مثيل لفئة ProductModel
*/
وظيفة عرض المنتج (&$model) {
$this->model=& $model;
}
//!
/**
* يبني الجزء العلوي من صفحة HTML
* @العودة فارغة
*/
رأس الوظيفة () {
}
//!
/**
* يبني الجزء السفلي من صفحة HTML
* @العودة فارغة
*/
تذييل الوظيفة () {
}
//!
/**
* يعرض منتج واحد
* @العودة فارغة
*/
وظيفة المنتج($id=1) {
$this->model->listProduct($id);
بينما ( $product=$this->model->getProduct() ) {
// ربط البيانات بـ HTML
}
}
//!
/**
* يبني جدول المنتج
* @العودة فارغة
*/
دالة جدول المنتج($rownum=1) {
$rowsperpage='20';
$this->model->listProducts($rownum,$rowsperpage);
بينما ( $product=$this->model->getProduct() ) {
// ربط البيانات بـ HTML
}
}
//!
/**
* إرجاع HTML المقدمة
* @ سلسلة العودة
*/
عرض الوظيفة () {
إرجاع $this->output;
}
}
?>
ملخص: نمط MVC شائع جدًا في بنية مواقع الويب. فهو يسمح لنا ببناء تطبيق من ثلاثة مستويات، وفصل الطبقات المفيدة عن التعليمات البرمجية، ومساعدة المصممين والمطورين على العمل معًا وتحسين قدرتنا على صيانة التطبيقات الحالية وتوسيعها. ستقدم لك هذه المقالة كيفية تنفيذ نمط MVC في PHP.
العلامات: موقع PHP MVC MVC نمط PHP
تساعدك Oracle على الحصول على رؤية دقيقة لكل رابط لوجستي
تساعدك Oracle في الحصول على رؤية دقيقة لكل رابط لوجستي، وأخيرًا، سنقوم بتنفيذ العرض كفئة فرعية.
<?php
/**
* التحكم في التطبيق
*/
فئة ProductController تمتد ProductView {
//! مُنشئ.
/**
* إنشاء كائن ProductController جديد
* @param $model مثيل لفئة ProductModel
* @param $getvars متغيرات أسلوب HTTP GET الواردة
*/
وظيفة ProductController (&$model,$getvars=null) {
ProductView::ProductView($model);
$this->header();
التبديل ( $getvars['view'] ) {
حالة "المنتج":
$this->productItem($getvars['id']);
استراحة؛
تقصير:
إذا (فارغ ($getvars['rownum'])) {
$this->productTable();
} آخر {
$this->productTable($getvars['rownum']);
}
استراحة؛
}
$this->footer();
}
}
?>
لاحظ أن هذه ليست الطريقة الوحيدة لتنفيذ MVC - على سبيل المثال، يمكنك استخدام وحدات التحكم لتنفيذ النماذج ودمج طرق العرض في نفس الوقت. هذه مجرد طريقة واحدة لإظهار النمط.
يبدو ملف Index.php الخاص بنا كما يلي:
<?php
require_once('lib/DataAccess.php');
require_once('lib/ProductModel.php');
require_once('lib/ProductView.php');
require_once('lib/ProductController.php');
$dao=& new DataAccess('localhost','user','pass','dbname');
$productModel=& new ProductModel($dao);
$productController=& new ProductController($productModel,$_GET);
صدى $productController->display();
>
جميلة وبسيطة.
لدينا بعض الحيل لاستخدام وحدات التحكم، في PHP يمكنك القيام بذلك:
$this->{$_GET['method']}($_GET['param']);
أحد الاقتراحات هو أن تحدد بشكل أفضل نموذج مساحة اسم عنوان URL للبرنامج (مساحة الاسم)، فستكون أكثر توحيدًا، على سبيل المثال:
"index.php?class=ProductView&method=productItem&id=4"
من خلاله يمكننا معالجة وحدة التحكم الخاصة بنا مثل هذا:
$view=new $_GET['class'];
$view->{$_GET['method']($_GET['id']);
في بعض الأحيان، يكون إنشاء وحدة تحكم أمرًا صعبًا، كما هو الحال عند مقايضة سرعة التطوير والقدرة على التكيف. المكان الجيد للحصول على الإلهام هو Java Struts الخاص بمجموعة Apache، والتي يتم تعريف وحدات التحكم الخاصة بها بالكامل بواسطة مستندات XML.