ببساطة، دور وحدة التحكم هو قبول الطلبات. يستخدم طريقة get، في هذه الحالة عبر URI، لتحميل وحدة وظيفية لتحديث أو إرسال طبقة العرض التقديمي. ستستخدم وحدة التحكم المتغير العام التلقائي $_GET لتحديد الوحدة التي سيتم تحميلها.
قد يبدو مثال الطلب كما يلي:
http://example.com/index.php?module=login
يبدو هذا بسيطًا، لكنه ليس كذلك في عملية التنفيذ. فيما يلي أجزاء الوسيطة التي يمكن التعرف عليها بواسطة وحدات تحكم متعددة:
تحدد الوحدة النمطية التي سيتم استخدامها، مثل المستخدمين. تحدد فئة الوحدة النمطية الفئة الوظيفية التي يجب استخدامها، مثل ما إذا كنت تريد من المستخدمين تسجيل الدخول أو تسجيل الخروج.
يحدد الحدث الحدث المحدد الذي سيتم استخدامه.
يمكن أن يوضح مثال أكثر تعقيدًا عنوان URL للطلب الذي يتكون في النهاية من كل وسيطة أعلاه:
http://example.com/index.php?module=users&class=login
يخبر هذا الطلب وحدة التحكم بذلك يجب عليه تحميل وحدة المستخدمين، ثم فئة تسجيل الدخول، وأخيرًا تشغيل الحدث الافتراضي لتسجيل الدخول::__default() لأنه لم يتم تحديد حدث معين.
فيما يلي جزء التعليمات البرمجية المحدد:
<?php
/**
*index.php
*
* @author جو ستامب < [email protected] >
* @ حقوق الطبع والنشر لجو ستامب < [email protected] >
* @license http://www.opensource.org/licenses/gpl-license.php
* @packageFramework
*/
require_once('config.php');
// {{{ __autoload($class)
/**
* __التحميل التلقائي
*
* يتم تشغيل التحميل التلقائي بواسطة PHP عندما لا يتمكن من العثور على الفصل الذي يحاول تحميله.
* من خلال تسمية فئاتنا بذكاء يجب أن نكون قادرين على تحميل معظم الفئات
* ديناميكيا.
*
* @author جو ستامب < [email protected] >
*param string $class اسم الفئة الذي نحاول تحميله
* @العودة فارغة
* @packageFramework
*/
الدالة __التحميل التلقائي($class)
{
$file = str_replace('_','/',substr($class,2)).'.php';
require_once(FR_BASE_PATH.'/includes/'.$file);
}
// }}}
if (isset($_GET['module'])) {
$module = $_GET['module'];
إذا (isset($_GET['حدث'])) {
$event = $_GET['event'];
} آخر {
$الحدث = '__default';
}
إذا (isset($_GET['class'])) {
$class = $_GET['class'];
} آخر {
فئة $ = وحدة $؛
}
$classFile = FR_BASE_PATH.'/modules/'.$module.'/'.$class.'.php';
إذا (file_exists($classFile)) {
require_once($classFile);
إذا (class_exists($class)) {
يحاول {
مثيل $ = جديد $class();
إذا (!FR_Module::isValid($instance)) {
die("الوحدة المطلوبة ليست وحدة إطار عمل صالحة!");
}
$instance->moduleName = $module;
إذا ($مثيل->مصادقة()) {
يحاول {
$result = $instance->$event();
إذا (! الكمثرى::isError($result)) {
$presenter = FR_Presenter::factory($instance->presenter,$instance
if (!PEAR::isError($presenter)) {);
$presenter->display();
} آخر {
يموت($presenter->getMessage());
}
}
} التقاط (خطأ $الاستثناء) {
يموت($error->getMessage());
}
} آخر {
die("ليس لديك حق الوصول إلى الصفحة المطلوبة!");
}
} التقاط (خطأ $الاستثناء) {
يموت($error->getMessage());
}
} آخر {
die("لم يتم العثور على وحدة صالحة لطلبك");
}
} آخر {
die("تعذر العثور على: $classFile");
}
} آخر {
die("لم يتم تحديد وحدة صالحة");
}
?>
فيما يلي التعليقات المحددة على الكود أعلاه:
قم بتحميل "config.php"
لتعريف وظيفة __autoload(). هذه وظيفة جديدة في PHP5، والتي تسهل التحميل الديناميكي لمختلف الفئات.
إذا تم تحديد وسيطة، فسيتم تحميل الوحدات والفئات والأحداث المحددة ذات الصلة،
متبوعة ببعض الأحكام وعمليات الخطأ المحددة،
وأخيرًا، بعد أن يكون كل شيء صحيحًا، يتم تحميل طبقة العرض التقديمي
[عنوان URL المألوف]
إذا كنت تعتقد أن عنوان URL للطلب المذكور في المثال أعلاه هو إذا كان ذلك يجعلك تشعر بعدم الارتياح، فاستخدم mod_rewrite لتنفيذ عناوين URL المألوفة. التالي هو الكود القياسي لإعادة الكتابة الفعلي الذي كتبه المؤلف لهذا الإطار:
RewriteEngine On
# قم بتغيير URI هنا إلى ما تريد أن تكون عليه صفحتك الرئيسية
RewriteRule ^/$ /index.php?module=welcome [L,QSA]
# التغييرات / Index.php?module=مرحبًا بك في /مرحبًا بـ
RewriteCond %{DOCUMENT_ROOT}/
%{REQUEST_FILENAME} !-d RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME}!-f
RewriteRule ^/([^/]*)$ /index. php?module=$1 [L,QSA]
# التغييرات /index.php?module=users&class=login إلى /users/login
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)/([^/]*)$ /index.php?module=$1&class=$2 [L,QSA]
# التغييرات /index.php?module=users&class=login&event =foo
# إلى /users/login/foo.html
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)/( [^/]*)/([^/]*).html$
/index.php?module=$1&class=$2&event=$3 [L,QSA]
توسيع وحدة التحكم
[وحدة التحكم الموسعة]
يحتوي على وحدة تحكم مركزية واحدة من المزايا هي أنه بعد إضافة بعض الوظائف، يمكن أن تنعكس على الفور من خلال وحدة التحكم. فيما يلي بعض الأفكار لتوسيع وحدة التحكم هذه لجعل إطار العمل أكثر قوة بشكل عام:
يمكنك استخدام SoapServer، وهو شيء جديد في PHP5، لاكتشاف ما إذا كان الطلب هو SOAP تلقائيًا.
يمكنك
استخدام وحدات التحكم لتصفية جميع المتغيرات العامة التلقائية مثل $_GET و$_POST لمنع تعليمات HTML البرمجية الضارة، وما إلى ذلك.
تحويل التعبيرات بسرعة، على سبيل المثال، من الوضع الافتراضي إلى وضع PDF
،
يمكنك إضافة آلية التخزين المؤقت مباشرة إلى وحدة التحكم.
هناك شيء واحد يجب ملاحظته وهو أنك في وحدة التحكم وستنعكس الوظيفة المضافة في البرنامج ككل. على سبيل المثال، تريد تصفية جميع المتغيرات العامة التلقائية، ولكن يحتاج العديد من مسؤولي التطبيقات إلى استخدام بعض أكواد HTML، الأمر الذي يصبح أمرًا صعبًا (ملاحظة المترجم: فكرتي هي إضافة عبارة شرطية if لتحميل وحدة معينة دون تطبيق التصفية وظيفة).