فصل 4. Zend_Controller

قائمة المحتويات

4.1. نظرة عامة
4.1.1. مقدمة
4.1.2. عملية التحويل - routing
4.1.3. Dispatch Token
4.1.4. عملية التنفيذ - dispatching
4.2. البداية
4.2.1. مقدمة
4.2.2. إعدادات السيرفر
4.2.3. ملف الـ Bootstrap
4.2.4. هيكلة المجلدات
4.2.5. IndexController
4.3. Subclassing
4.3.1. Introduction
4.3.2. Conventions
4.3.3. Router Interface
4.3.4. Dispatcher Interface
4.4. الـ Plugins
4.4.1. مقدمة

4.1. نظرة عامة

4.1.1. مقدمة

يوفر 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 الجديد , و ذلك إلى ان تنتهى العملية .

4.1.2.  عملية التحويل - routing

قبل أن تتمكن من إنشاء اول 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 .

4.1.3. Dispatch Token

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 .

4.1.4. عملية التنفيذ - dispatching

عملية التنفيذ هى عملية أخذ token أو Zend_Controller_Dispatcher_Token , ثم إستخراج المعلومات الموجودة به : أسم الـ controller و أسم الـ action و القيم الإختيارية الممررة , و بعدها يتم إنشاء instance جديد من الـ controller ثم إستدعاء الـ action من هذا الـ controller.