قائمة المحتويات
يوفر Zend_Controller
البنية اللازمة لإنشاء مواقع تعتمد على النمط ( MVC)
او Model-View-Controller.
نظام Zend_Controller
تم تصميمه ليكن خفيف و بسيط و قابل للتمدد و ان يكن modular.
إنه نظام مصغر الى اقصى حد معقول ليوفر المرونة و الحرية لمن يستخدمه, فى حين انه يوفر كل البنية الازمة , ولهذا
السبب يتشارك اجزاء النظام المبنى بـ Zend_Controller
فى هيئة تنظيم الكود و المصطلحات.
Zend_Controller
يعتمد على على عدة components اخرى, فى حين انه لا يشترط عليك ان
تكن مدرك ما يحدث خلف كواليس هذه الـ components لتتمكن من استخدام النظام, إلا ان بعض المعرفة يعملية تدفق
العمليات ستكن مساعدة جدا لك.
Zend_Controller_Front
يقود و يتحكم فى تدفق العمليات داخل نظام Zend_Controller
, و هو تطبيقنا للنمط المسمى
FrontController , و يقوم ايضا Zend_Controller_Front
بإستلام و معالجة كل الطلبات المستلمة
من قبل السيرفر , وهو مسئول بالكامل عن نقل هذه الطلبات إلى الـ ActionControllers اى
(Zend_Controller_Action
).
Zend_Controller_Router
هو الموجه(router) . التوجيه او الـ routing هو عملية استلام URI
ثم تقسيم مكوناته إلى اجزاء لمعرفة أى Controller و أى Action فى هذا الـ Controller يجب ان يستقبل الطلب.
يتم تجميع التعريفات الخاصة بالـ Controller و الـ Action و اى متغيرات اخرى ممررة , و توضع فى object يسمى
Zend_Controller_Dispatcher_Token
. و تحدث عملية التحويل مرة واحدة فقط و ذلك بمجرد
إستلام الطلب و قبل تشغيل اول Controller .
Zend_Controller_Dispatcher
هو المنفذ "Dispatcher". عملية التنفيذ هى عملية اخذ
Zend_Controller_Dispatcher_Token
ثم إيجاد ملف الـ controller المحدد, ثم إنشاء instance
جديد من الـ class الخاص بهذا الـ controller (يجب ان يرث من Zend_Controller_Action
) .
و اخر خطوة هى إستدعاء الـ method الخاص بهذا الـ action من الـ object الخاص بالـ controller .
على عكس عملية التوجيه "الـ routing" و التى تحدث مرة واحدة , تحدث عملية التنفيذ "dispatching" بشكل متكرر.
يتم إستدعاء Zend_Controller_Dispatcher
بشكل متكرر من قبل
Zend_Controller_Front
إلى ان يتم تنفيذ كل الـ actions و ذلك بتسلسل منطقى.
Zend_Controller_Action
هو العنصر الأساسى فى تكوين controller . كل controller هو
عبارة عن class يرث من Zend_Controller_Action
, و هذا الـ class يحتوى على methods
تعمل كـ actions .
كيفية عمل Zend_Controller
تعتبر بسيطة نسبياً . حيث يتم إستلام طلب "request" عن
طريق Zend_Controller_Front
, و الذى بدوره يستدعى
Zend_Controller_Router
ليعرف أى Controller (و أى action فى هذا الـ controller ) سيتم
تنفيذه .
ثم يقوم Zend_Controller_Router
بتقسيم الـ URI إلى اجزاء صغيرة و يضعها فى object من
Zend_Controller_Dispatcher_Token
و الذى بدوره يصف اين ستتم عملية التنفيذ .
بعدها يقوم Zend_Controller_Front
بتشغيل عملية تنفيذ متكرر "dispatch loop".
حيث يقوم بإستدعاء Zend_Controller_Dispatcher
و تمرير الـ Token إليه , ليقوم بتنفيذ
الـ controller و الـ action المحددين. و بعد إنتهاء الـ controller من عمله , يعود التحكم إلى
Zend_Controller_Front
.
إذا قام الـ controller بتوضيح انه يجب تنفيذ controller اخر و ذلك عن طريق إرجاعه لـ token جديد ,
سيتم إستكمال الدورة التنفيذية و سيتم تنفيذ الـ controller الجديد , و ذلك إلى ان تنتهى العملية .
قبل أن تتمكن من إنشاء اول controller بنفسك, يجب ان تفهم كيف تعمل عملية التوجيه "routing" كما هى مطبقة فى
Zend_Controller_Router
. تذكر أن كيفية العمل مقسمة الى عمليه توجيه و التى تحدث مرة واحدة ,
و عملية تنفيذ "dispatching" و التى تحدث بعدها فى حلقة تكرارية.
يقوم Zend_Controller_Front
بإستدعاء Zend_Controller_Router
ليقوم بترجمة محتوى الـ URI و يستخرج اسم الـ controller و اسم الـ action فى هذا الـ controller .
يقوم Zend_Controller_Router
بأخذ الـ URI و تقسيمه إلى اجزاء و يضعها فى object يقوم بحفظ
هذه القيم و يسمى Zend_Controller_Dispatcher_Token
و الذى سيتم تمريره إلى المنفذ
"الـ dispatcher" و هو (Zend_Controller_Dispatcher
).
يقوم المحول "الـ router" بعملية بسيطة ليتعرف على اسم الـ controller و اسم الـ action التابع لهذا الـ controller :
http://framework.zend.com/controller/action/
لاحظ بالأعلى ان اول قسم دائما هو اسم الـ controller و أن القسم التانى دائما يحمل أسم الـ action.
اختيارياً, يمكنك تمرير قيم فى الـ URI و التى سيتم تمريرها بعدها الى الـ controller , و هذا يكون على شكل زوج من key/value :
http://framework.zend.com/controller/action/key1/value1/
إذا لم يتم تمرير قيمة فى مكان الـ /controller/
فى الـ URI, سيتم اعتبار أن قيمته هى
"index
". و إذا لم يتم تمرير قيمة فى مكان الـ /action/
فى الـ URI , سيتم
اعتبار ان قيمته هى "index
" ايضاً. هذا المثال يوضح أكثر :
http://framework.zend.com/roadmap/future/ Controller: roadmap Action : future http://framework.zend.com/roadmap/ Controller: roadmap Action : index http://framework.zend.com/ Controller: index Action : index
![]() |
ملاحظة |
---|---|
نحن نقوم حالياً بتطوير محول "router" جديد يحتوى على محرك اعادة كتابة للـ URI , و الذى سيعطى امكانيات أكثر مرونة من الموجودة فى المحول الحالى. و هذا سيكون متوافر بإصدار تجريبى فى القريب العاجل . |
اسم الـ controller و اسم الـ action التابع له و أى قيم ختيارية اخرى ممررة يتم تجميعها فى token او "موصِف"
يسمى Zend_Controller_Dispatcher_Token
. يتم إرجاع هذا الـ token إلى
Zend_Controller_Front
و الذى بعدها سيقوم بالدخول فى مرحلة التنفيذ , بمجرد الدخول فى
عملية التنفيذ "dispatching" , سيتم تمرير الـ token إلى Zend_Controller_Dispatcher
.
Token التنفيذ أو "Dispatch Token" عبارة عن كائن قيم أو "value object" يتم تمريره بين
Zend_Controller_Front
و الـ calsses التى تطبق الـ interfaces الخاصة بالمحول "router"
و المنفذ "dispatcher" . و يحوى تعريف لأسم الـ controller و أسم الـ action و القيم التى سيتم تمريرها إلى الـ action.
يتم الوصول إلى اسم الـ controller بإستخدام ()getControllerName
و
()setControllerName
.
اسم الـ action الذى سيتم إستدعائه من الـ controller يمكن الوصول إليه بإستخدام
()getActionName
و ()setActionName
.
القيم التى ستمرر إلى الـ action عبارة عن associative array تتكون من زوج من key/value و الذى يمكن الوصول
إليهم بإستخدام ()getParams
و ()setParams
.
عملية التنفيذ هى عملية أخذ token أو Zend_Controller_Dispatcher_Token
,
ثم إستخراج المعلومات الموجودة به : أسم الـ controller و أسم الـ action و القيم الإختيارية الممررة ,
و بعدها يتم إنشاء instance جديد من الـ controller ثم إستدعاء الـ action من هذا الـ controller.