فصل 4. Zend_Controller
السابق |  | التالي

## فصل 4. Zend_Controller

## 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.

السابق |  | التالي
3.4. Zend_Config_Xml | البداية | 4.2. البداية