[php5] بناء نظام MVC بسيط [4,5]

مدرج تحت قسم: دروس
25 سبتمبر 2007

نكمل اليوم في الجزء الرابع والخامس

الجزء الرابع – عنصر التحكم Controller

هذا الجزء بسيط جداً ، في البداية نقوم بعمل المجلد السابق اشارة إليه controllers ليحوي جميع عناصر التحكم ثم نقوم بإنشاء ملف جديد باسم controller_base.php بداخل مجلد classes السابق إنشاؤه.

ثم نضع بداخل هذا الملف controller_base.php الكود الآتي.

<?php
Abstract Class Controller_Base {
        protected $registry;
        function __construct($registry) {
                $this->registry = $registry;
        }
        abstract function index();
}
?>

الكائن هذا سيبقى هو الأب parent لكل كائنات عناصر التحكم التي سننشؤها بعد هذا وهو يقوم بإنشاء نسخة من كائن التسجيل مرة واحدة حتى لا نقوم بنسخها في كل عنصر تحكم إنما ننشؤها هنا مرة واحدة و عن طريق الوراثة ستعمم لكل كائنات عناصر التحكم الاخري و قمنا بجعله abstract و أنشأنا وسيلة index وجعلناها abstract بحيث أن أي كائن سيورث من هذا الكائن يجب أن يعرف الوسيلة index ويجب أن يعرفها في نفس مستوى الظهور أو أقل منه يعني لو عملنا الوسيلة index بمستوي protected يجب في الكائنات الوارثة أن نقوم بتعريفها protected أيضا أو public لكن لا يجوز تعريفها private وفائدة جعل هذه الوسيلة abstract هو ضمان احتواء كل كائن عنصر تحكم على وسيلة index.

سنقوم الآن بإنشاء أول عنصر تحكم قم بإنشاء ملف باسم index.php داخل المجلد controllers وقم بإضافة الكود الآتي إليه.

<?php
Class Controller_Index Extends Controller_Base {
        function index() {
                echo 'Hello Swalif :) ';
        }
}?>

فبذلك قمنا بإنشاء أول كائن عنصر تحكم ولاحظ بالسطر الأول تقوم بكتابة controller_ ثم اسم عنصر التحكم والذي سيكون على نفس اسم ملف عنصر التحكم ويجب إنشاء وسيلة index وطبعاً إذا لم نحدد مستوي ستحدد تلقائيا public وعند تشغيل النظام سيعمل بنجاح وهذا يعني ان كائن المسار الذي سبق وقمنا بإنشاءه يعمل بكفاءة وقام بتحميل عنصر التحكم الصحيح وتنفيذ ما بداخله ، لنقوم بإنشاء عنصر تحكم آخر ليتوافق مثلاً مع طلب مثل links/view، سنقوم بإنشاء ملف باسم links.php داخل مجلد controllers، وقم بإضافة الكود الآتي إليه.

<?php
Class Controller_Links Extends Controller_Base {
        function index() {
                echo 'Hello , This Is The index of Links ';
        }
        function view() {
                echo 'Hi , This Is The Links View ';
        }
}?>

ولنفترض ان المجلد الرئيسي للنظام اسمه MVC اكتب الرابط بالشكل الآتي
http://localhost/MVC/index.php?route=links/view
سيعرض لك الجملة Hi, This Is The Links View
بإنشاء عنصر تحكم جديد واى وسائل بداخله نكون أنشأنا صفحة جديدة كاملة في نظامنا ولا نحتاج إلى include لأي ملف عام في البداية.

الآن جزء عناصر التحكم يعمل بسلام ننتقل الآن لجزء العرض View

الجزء الخامس- نظام العرض

مثل نظام النموذج هناك العديد من الطرق المختلفة لإنشاء نظام العرض ، يمكننا استخدام كائن المسار ليقوم بتحميل ملف باسم يبدا مثلاً ب view_ ثم اسم يعبر عن محتواه مثل view_delete.php، ولكن لنبقي على هذا الدرس بسيط سنقوم بإنشاء كائن للقوالب بسيط جداً ليقوم بعرض القوالب.

نقوم بإنشاء ملف جديد باسم template.php في مجلد classes ثم نقوم بوضع الكود الآتي بداخله.

<?php
Class Template {
        private $registry;
        private $vars = array();

function __construct($registry) {
                $this->registry = $registry;
        }
}?>

بنينا هنا الهيكل الاساسي لكائن القالب ، في البداية أنشأنا نسخة من كائن التسجيل في المشيد وقمنا بتعريف خاصية vars والتي ستحتوي على المتغيرات وقيمها على هيئة مصفوفة ( مفتاح => قيمة ) ويكون المفتاح هو المتغير ، الآن سنضيف هذا الكود في index.php قبل الجزء الخاص بكائن المسار router.

$template = new Template($registry);
$registry->set ('template', $template);

قمنا هنا بإنشاء نسخة من كائن القالب وبدوره سينشئ نسخة من كائن التسجيل ثم نقوم بتسجيل المتغير template وقيمته هي كائن القوالب لاستخدامه في جميع الصفحات بشكل عام global.

نحتاج الآن إلى وسيلة إدخال بيانات لكائن القوالب set() لتخزين المتغيرات وقيمها لتعرضها في القوالب. ووسيلة لحذف البيانات المدخلة remove() لنقم بإضافة الكود الآتي إلى ملف template.php.

function set($varname, $value, $overwrite=false) {
        if (isset($this->vars[$varname]) == true AND $overwrite == false) {     $Verror='Unable to set var <font color="red"><b> '.$varname.'</b></font> Already Set !!';
die($Verror);
                return false;
        }
        $this->vars[$varname] = $value;
        return true;
}
function remove($varname) {
        unset($this->vars[$varname]);
        return true;
}

كما نري وسيلة الإدخال set() ووسيلة الحذف remove() وسائل بسيطة جداً تستخدم لإدخال البيانات وحذفها من كائن القوالب ومشابهين لعملية الإدخال والحذف في كائن التسجيل الذي سبق شرحه.

الآن يمكننا تخزين البيانات ، نحتاج الآن إلى وسيلة عرض show() لتقوم بعرض القوالب ، سنقوم بإنشاء مجلد باسم templates داخل المجلد الرئيسي MVC وسيحتوي علىجميع ملفات القوالب ثم سنقوم باستخدام include() لتضمين ملفات القوالب والكود الآتي للوسيلة show() في ملف template.php.

function show($name) {
        $path = site_path . 'templates' . DS . $name . '.php';
        if (file_exists($path) == false) {
$Terror='Template <font color="red"><b> '.$name.'</b></font> does not exist !!';
die($Terror);
               }
        foreach ($this->vars as $key => $value) {
                $$key = $value;
        }
        include ($path);
}

اكتمل الآن كائن القالب ويمكن استخدامه في عرض القوالب داخل عناصر التحكم controllers
ومثال على ذلك ننشئ ملف باسم almashroo.php في مجلد templates ثم اكتب به الكود الآتي.

<br /> Hello , This Is Swalif Template <br />
And I'm  <?php echo $my_name; ?>

ثم قم بفتح ملف ال index.php بمجلد controllers والذي كان يحتوي على Hello Almashroo في وسيلة index
قم بوضع هذا الكود داخل وسيلة index.

        $this->registry['template']->set ('my_name', 'Mohamed – Hawy_PHP');
        $this->registry['template']->show('swalif');

فى السطر الأول قمنا بتعيين مفتاح باسم my_name وقمنا بتعيين قيمة له وهي اسمي، وبذلك استطيع ان أقوم بطباعة اسم الفتاح كمتغير ليخرج القيمة الذي قمت بتعيينها إليه. ثم في السطر الثاني استخدمت وسيلة show لعرض القالب الذي سبقت وسميته almashroo، طبعاً تكتب اسمه هنا بدون الامتداد لأن احنا في وسيلة show بنضيف امتداد php يمكنك تغييره لأي امتداد.

اذا الكود الكامل لوسيلة index في عنصر التحكم index الموجود داخل controllers هو :

<?php
Class Controller_Index Extends Controller_Base {
        function index() {
                echo 'Hello Swalif :) ';
    $this->registry['template']->set ('my_name', 'Mohamed – Hawy_PHP');
    $this->registry['template']->show('swalif');
        }
}?>

قم بالتجربة وقم بتغيير الاسم وقم بعمل متغيرات أخرى وتعيين قيم إليها ولاستخدام المصفوفات.

$info = array ( "Mohamed" , "Hawy_PHP" , "3/11/1990" , "ATSIT Student " ) ;
 $this->registry['template']->set ('my_info', $info);

وفى صفحة القالب

 print_r($my_info);

وسيقوم بعرض محتويات المصفوفة ، وبهذا يكون نظام MVC البسيط انتهي ويمكن استخدامه في إنشاء اى موقع ولكن هناك نقطة يجب علينا الاهتمام بها وهي حماية ملفاتنا فكل المجلدات الفرعية التي قمنا بانشائها مثل templates و controllers متاحين للعامة ويمكنهم الاطلاع على الملفات وتشغيلها بدون تشغيلها من النظام نفسه لذللك سنمنع الوصول لهذه المجلدات باستخدام ال htaccess.

سنكتب به السطر التالي.

Deny from ALL

واحفظه باسم .htaccess وضعه في اى مجلد تريد منع الوصول لملفاته.

ونقطة أخرى مفيدة ، الآن يتم الوصول لعناصر التحكم بالشكل الآتي مثلاً
http://localhost/mvc/index.php?route=links/view
ما رايكم في جعل الوصول إليه بالشكل الآتي باستخدام mod_rewrite
http://localhost/mvc/inks/view
ضع الكود الآتي في ملف .htaccess في المجلد الاساسي mvc.

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]

وبهذا ينتهي هذا النظام البسيط جدا ، هناك طرق عديدة ومختلفة لبناء هذا النظام وهذه الطريقة ربما لا تكون افضلهم ولكنه يظهر لكم قوة نظام MVC.

ليس الهدف الاساسي من هذا الدرس ان تقوم ببناء نظام خاص بيك من الصفر فهذا سيتطلب جهد كبير ووقت ويمكنك فعلاً استخدام ما ابتكره غيرك ويوجد العديد من اطارات العمل القوية مثل CodeIgniter.

ولكن الهدف الاساسي إذا كنت فعلاً تستخدم أو استخدمت أو تفكر في استخدام احد هذه الاطارات ان يكون لديك فكرة وخلفية بسيطة عن اساس عملها وهيكلها.

هذا الدرس ليس من إبداعي ولكنه درس قرأته وقمت بتطبيقه والحمد لله اضفت إليه الكثير و قمت ببناء إطار عمل بسيط ولكن ما يميزه عن غيره بالنسبة لي هو أني أنا الذي بنيته وفاهم كل خطوة فيه كيف، وهذا تفضيل شخصي ليس اكثر والدرس هذا للكاتب Dennis pallett ورابط الدرس من هنا عندما قرأته وفهمته وقمت بتطبيقة وبدات بالفعل في الإضافة إليه و بدأت في اطار العمل الخاص فكرت في انه ربما يفيد احد قرائته فقمت بوضعه بين ايديكم واتمني من الله ان ينال اعجابكم.

وإذا أردت المزيد عن كيفية عمل اطارات العمل فانصحك بقراءة هذا الدرس لراسموس والد ال PHP

وستجدوا كل الملفات والنظام كامل في هذا الدرس هنا Almashroo_MVC
وان شاء الله قريبا سأطرح نسخة من النظام مع تطبيق على استخدام مكتبة ال PDO باذن الله.

وبالنسبة لكلامي فوق عن ( اعتماد مطوري PHP مكتبة PDO في PHP6 مكتبة الاتصال بقواعد البيانات وتحويل الباقي إلى PECL ) ليس من فراغ ولكنه من أحداث اجتماع مطوري PHP فعلاً لمناقشة اهم التغييرات التي ستحدث في PHP6 مثل موضوع مكتبات قواعد البيانات السابق ذكره وحذف الـ Register_globals و الSafe_mode وال magic_quotes والكثير من التعديلات بشكل رسمي جدول اجتماع مطوري PHP لمناقشة التغييرات في PHP6

وفى النهاية فإن أصبت فمن الله عز وجل و إن أخطات فمن نفسي ومن الشيطان.

أجزاء الدرس

عن الكاتب

Hawy_PHP مبرمج ومطور مواقع ، طالب بمدرسة تكنولوجيا المعلومات ، مدمن برمجة :)

  • Share/Bookmark

أضف تعليقك




يمكنك استخدام الوسوم التالية في التعليق: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


* حقول مطلوبة