4.2. البداية

4.2.1. مقدمة

تم بناء Zend_Controller و فى اعتبارنا ان يكون قابل للتمدد بسهولة, سواء عن طريق إن شاء subclasses ترث من الـ class الموجودة او إنشاء classes جديدة تعتمد على الـ interfaces المسمى Zend_Controller_Router_Interface و Zend_Controller_Dispatcher_Interface.

4.2.2. إعدادات السيرفر

تم بناء Zend_Controller ليدعم المواقع الجديدة بميزة الـ URIs النظيفة [1] , و هذا يحتاج الى ان تكون هذه الأعدادت مدعومة فى الـ webserver الخاص بك, اى يجب ان تتوفر خاصية اعادة كتابة الـ URIs لكى تتمكن من اعادة توجيه كل الطلبات فى موقعك الى ملف واحد , و هنا نحن نسميه "index.php" , و الذى بدوره سيكون [2]bootstrap و سيشغل Zend_Controller_Front. على سيرفرات الـ Apache هذا يتم التحكم به من خلال module اختيارى اسمه mod_rewrite.

الخطوة الأولى لإعداد السيرفر هى النجاح فى تركيب و تشغيل mod_rewrite. الخطوة التالية هى وضع ملفين فى الـ [3]document root و هما : htaccess. و ملف index.php . ملف htaccess. يتم استخدامه من قبل Apache و يجب ان يحتوى على اوامر mod_rewrite لتقوم بإعادة تحويل كل الطلبات الى index.php . لأسباب تنتمى إلى عملية التطوير , يكن من الأسهل كتابة امر mod_rewrite يقوم بتحويل كل الطلبات الى index.php ما عدا التى تحتوى امتداد ملفات معينة , و هنا مثال لملف htaccess. مماثل :

RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

فى المثال , كل الطلبات التى لا تحتوى اى من امتدادات الملفات المذكورة فى الأعلى , سيتم تحويلها الى index.php . هذا مفيد فى اثناء عملية التطوير, بينما فى مرحلة الإنتاج يجب ان يتم كتابة اوامر اعادة التوجيه بحيث يتم إستثناء مجلدات معينة و ليس امتدادات ملفات.

4.2.3. ملف الـ Bootstrap

بعد الإنتهاء من ملف htaccess. , قم بإنشاء ملف جديد اسمه index.php , السبب من إنشاء index.php هو ان يكون [2]bootstrap لـ Zend_Controller_Front , و الذى يجب ان يكون خارج الـ [3]document root.

[ملاحظة] ملاحظة
ملف الـ bootstrap يجب ان يكون ملف الـ PHP الوحيد المحفوظ فى الـ document root.

لأسباب امنية, ينصح إطار عمل Zend بأن لا يتم وضع اى ملف PHP فى مجلدات يمكن الوصول إليها من خلال الـ webserver (اى المجلدات فى document root) . بالرغم من أن هذا لا يمكن تنفيذه فى بعض الحالات, مثل فى سيرفرات الأستضافة المتشاركة, يجب ان تعتبر هذا من العادات الجيدة و التى يجب ان تعتمد عليها كلما امكن.

قم بإنشاء ملف الـ bootstrap المسمى index.php و ضعه فى الـ document root ليقوم بتشغيل Zend_Controller_Front :

<?php
				
require_once 'Zend/Controller/Front.php';

Zend_Controller_Front::run('/path/to/your/controllers');

?>

إقرأ الجزء القادم بالنسبة الى path/to/your/controllers/. كما هو موضح فى ملف README.txt, المجلد الذى يحتوى مكتبة إطار عمل Zend يجب ان يكون فى الـ include_path. إذا لم تقم بعمل هذا فى ملف php.ini , يمكنك أستخدام ()set_include_path فى بداية الملف قبل ()require_once.

[ملاحظة] ملاحظة
فى هذا الوقت, نحن نقوم بالبحث عن حل لا يتطلب توافر mod_rewrite . ربما سنقوم بتوفير اعدادات للأنظمة التى تعمل مع او بدون امكانيات الـ mod_rewrite . ايضا يرجى ملاحظة ان هذا النظام ليس مرتبط بـ Apache و mod_rewrite تحديداً, و لكن اى webserver لديه هذه القدرة على اعادة التوجيه يجب ان يفى بالغرض.

4.2.4. هيكلة المجلدات

ينصح فى المواقع التى تعتمد على إطار عمل Zend ان تتشارك جميعها فى هيكلة موحدة لمجلداتها , ربما هذا لا يمكن تطبيقه فى بعض الحالات و لكن يفضل ان تطبقه فى اغلب او كل تطبيقاتك , فعند اختياراك ان تلتزم بهذه الهيكلة سيكن من السهل فهم الكود من قبل اى شخص يألف بنية إطار عمل Zend .

بنية المجلدات المقترحة تتكون من مجلدين اساسيين , مجلد اسمه library ( سيحتوى المكتبات الخاصة بـ Zend و غيرها) و المجلد الثانى يسمى application .

/application
  /models
  /views
  /controllers
/document_root
  /images
  /styles
  .htaccess
  index.php
/library
  /Zend
[ملاحظة] ملاحظة
هذا القسم لم ينتهى بعد و مازال تحت البناء و يمكن ان يتغير محتواه فى اى وقت.

4.2.5. IndexController

كل تطبيق يجب ان يوفر controller بإسم IndexController. هذا هو الـ controller الذى سيتم الوصول إليه عندما لا يتم تحديد controller معين فى الـ URI, مثال على URI مماثل يمكن ان نراه هنا:

http://framework.zend.com/

الـ class المسمى IndexController يجب ان يتم حفظه فى ملف بإسم IndexController.php, و هذا الملف يجب ان يوضع فى مجلد الـ controllers . يجب ان يرث IndexController من Zend_Controller_Action , و هنا مثال على إنشاء IndexController :

<?php
				
require_once 'Zend/Controller/Action.php';

class IndexController extends Zend_Controller_Action 
{
	public function indexAction()
	{
		echo 'Hello from IndexController';
	}

	public function noRouteAction()
	{
		$this->_redirect('/');
	}
}

?>
[ملاحظة] ملاحظة
هذا القسم لم ينتهى بعد و مازال تحت البناء و يمكن ان يتغير محتواه فى اى وقت.


[1] الـ URIs النظيفة : مثلا عنوان مثل http://www.site.com/index.php?q=cat&id=45 لا يعتبر نظيف , و لكن هذا يعتبر نظيف http://www.site.come/cat/45 , و هذا يعطى نفس قيمة الأول .

[2] منطقة بداية تشغيل برنامج

[3] document root او المجلد الجزرى هو المجلد الرئيسى فى موقعك حيث يتمكن المستخدم من الوصول إليه بمجرد كتابة إسم الموقع فقط.