วันอังคารที่ 7 ธันวาคม พ.ศ. 2553

Zend Framework Bootstrap

สืบเนื่องจากบทความที่แล้ว http://web-programming-bookmark.blogspot.com/2010/12/zend-framework-quick-start-zend.html
ความนี้มาดูโครงสร้างของ folder กันครับ
c:/www/quick .... โปรเจค quick start
c:/www/quick/application ....เก็บ application
c:/www/quick/data .... เก็บไฟล์ data หรือ database
c:/www/quick/library .... เก็บ zend library แต่ใน quick start กำหนดไว้อีกที่นึงแล้วตรงนี้ไม่ตรงเก็บอะไร
c:/www/quick/public .... เก็บ path ที่เก็บไฟล์ที่ผู้ใช้สามารถเข้ามาดูเว็บเพจได้
c:/www/quick/scripts .... เก็บไฟล์ script ที่ใช้อื่นๆ อย่างเช่นไฟล์ที่ใช้สร้างฐานข้อมูลจากไฟล์ sql

ส่วนสำคัญที่สุดจะอยู่ที่ c:/www/quick/application เป็นโฟล์เดอร์ที่เก็บไฟล์ที่ใช้ในการสร้างเว็บเพจโดยตรงครับ

เริ่มต้นจากการเข้าถึง http://localhost/quick/public/ (controller = index, action = index)
ไฟล์ c:/www/quick/public/index.php เป็นไฟล์ที่เริ่มทำงานไฟล์แรก

<?php //public/index.php

// APPLICATION_PATH คือค่าคงที่ที่ชี้ไปยัง sub directory 'application'
// เราใช้ APPLICATION_PATH เพื่อใช้ในการอ้างถึง directory 'library' ใส่ไปใน include_path
// เพื่อให้ PHP สามารถค้นหาคลาส Zend Framework ของเรา

define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application/'));
set_include_path(APPLICATION_PATH . '/../library' . PATH_SEPARATOR . get_include_path());

// AUTOLOADER - ตั้งค่าการ autoload
// เป็นทริกที่ช่วยให้ ZF โหลด class ไฟล์โดยอัตโนมัติ
// ดังนั้นคุณไม่ต้องเขียนโค้ด include และ require จำนวนมาก
require_once "Zend/Loader.php";
Zend_Loader::registerAutoload();

// REQUIRE APPLICATION BOOTSTRAP: เพื่อสร้างส่วนเฉพาะเจาะจงของ applicaion
// นี้อนุญาติให้คุณสร้างสภาพแวดล้อมแบบ MVC เพื่อใช้งาน. ในภายหลังคุณสามารถใช้ไฟล์นี้อีกครั้งเพื่อการทดสอบระบบ
// บล๊อก try-catch ข้างล่างสาธิตให้ดูว่าคุณจะควบคุม bootstrap exceptions ได้อย่างไร
// ใน application นี้, ถ้าคุณนิยาม APPLICATION_ENVIRONMENT เป็นอย่างอื่นนอกจาก 'production', เราจะแสดงผล
// exception และ stack trace ที่หน้าจอเพื่อช่วยในการแก้ไขปัญหาที่เกิดขึ้น
try {
require '../application/bootstrap.php';
} catch (Exception $exception) {
echo '<html><body><center>'
. 'An exception occured while bootstrapping the application.';
if (defined('APPLICATION_ENVIRONMENT') && APPLICATION_ENVIRONMENT != 'production') {
echo '<br /><br />' . $exception->getMessage() . '<br />'
. '<div align="left">Stack Trace:'
. '<pre>' . $exception->getTraceAsString() . '</pre></div>';
}
echo '</center></body></html>';
exit(1);
}

// DISPATCH: ส่งต่อการ request โดยใช้ front controller.
// front controller เป็น singleton, และในตอนนี้ควรจะถูกสร้างขึ้นแล้ว.
// เราจะจับเอา instance และส่งต่อมัน, ซึ่งก็คือการส่งต่อให้กับ application ของคุณ
Zend_Controller_Front::getInstance()->dispatch();


ไฟล์ c:/www/quick/application/bootstrap.php
สังเกตว่าไฟล์นี้จะถูก include โดยไฟล์ /public/index.php ข้างบนครับ
หน้าที่ของไฟล์ bootstrap.php ก็คือโหลดค่า config ขึ้นมา
และนำไปใช้ในการกำหนดค่าให้กับองค์ประกอบต่างๆ ของ model, view และ controller


<?php //application/bootstrap.php

// APPLICATION CONSTANTS - กำหนดค่า คงที่ท่จะใช้ใน application นี้
// ตัวแปรนี้สามารถใช้ได้ตลอดทั้ง application, แม้แต่ในไฟล์ ini
// เราประกาศค่าคงที่ APPLICATION_PATH ที่นี่สำหรับกรณีที่ entry point ของเรา
// ไม่ใช่ index.php (ตัวอย่างเช่น ถ้ามีการเรียกใช้จาก test suite หรือ script)
defined('APPLICATION_PATH')
or define('APPLICATION_PATH', dirname(__FILE__));

defined('APPLICATION_ENVIRONMENT')
or define('APPLICATION_ENVIRONMENT', 'development');

// FRONT CONTROLLER - ดึงเอา front controller มาใช้.
// Zend_Front_Controller ถูกสร้างขึ้นโดยใช้รูปแบบ Singleton,
// ซึ่งเป็นรูปแบบการออกแบบ ที่นำมาใช้เพื่อทำให้แน่ใจว่ามีเพียงแค่ 1 instance ของ
// Zend_Front_Controller ถูกสร้างในแต่ละ request
$frontController = Zend_Controller_Front::getInstance();


// CONTROLLER DIRECTORY SETUP - ให้ front controller ชี้ไปยังไดเรคทอรี่ของ
// action controller ของคุณ
$frontController->setControllerDirectory(APPLICATION_PATH . '/controllers');

// APPLICATION ENVIRONMENT - กำหนดค่า environment ปัจจุบัน
// กำหนดค่าตัวแปรใน front controller เพื่อแสดงถึง environment ปัจจุบัน
// ปกติจะเป็นค่า development, staging, testing, production, แต่ทั้งหมด
// ขึ้นอยู่กับความจำเป็นของการจัดระเบียบโครงสร้างของเว็บของคุณ
$frontController->setParam('env', APPLICATION_ENVIRONMENT);

// LAYOUT SETUP - สร้าง layout component
// คอมโพเน้นท์ Zend_Layout จะทำหน้าที่ในการสร้างรูปแบบ view 2 ขั้น
// คำสั่งนี้เป็นการบอก component ว่าจะหา layouts scripts ได้จากที่ไหน
Zend_Layout::startMvc(APPLICATION_PATH . '/layouts/scripts');

// VIEW SETUP - กำหนดค่า properties เริ่มต้นให้กับออปเจค View
// คอมโพเน้นท์ Zend_View มีประโยชน์ในการสร้าง views. ที่นี่, เราจับเอา
// instance ของ view ที่เป็น"global" จากออปเจค layout, และระบุค่า doctype
// ที่เราต้องการใช้ -- ในกรณีนี้, เราเลือกใช้ XHTML1 Strict
$view = Zend_Layout::getMvcInstance()->getView();
$view->doctype('XHTML1_STRICT');

// CONFIGURATION - สร้างออปเจค configuration
// คอมโพเน้นท์ Zend_Config_Ini จะวิเคราะห์ไฟล์ ini, และแยกแยะค่าตามแต่ละ
// section. ในที่นี่เราจะใช้ชื่อ section สอดคล้องกับ APP's Environment
$configuration = new Zend_Config_Ini(APPLICATION_PATH . '/config/app.ini', APPLICATION_ENVIRONMENT);

// DATABASE ADAPTOR - สร้าง database adpter
// Zend_Db ถูกสร้างขึ้นอยู่ในรูปแบบ factory interface ซึ่งช่วยให้ developer
// ส่งชื่อ adapter และ parameter ต่างๆ ซึ่งจะใช้ในการสร้างออปเจค
// database adater ที่เหมาะสม. ในตัวอย่างนี้, เราจะใช้ค่าที่ถูกพบใน section 'database' ของออปเจค configuration.
$dbAdapter = Zend_Db::factory($configuration->database);

// DATABASE TABLE SETUP - สร้าง Database Table Adapter
// เนื่องจาก application ของเราจะใช้งานคอมโพเน้นท์ Zend_Db_Table,
// เราจำเป็นต้องส่งค่า default adapter ไป เพื่อให้ทุกๆ ออปเจค table สามารถนำมาใช้
// ในยามที่จะส่ง query ไปยัง db
Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter);

// REGISTRY - สร้าง register ของ application
// registry ช่วยให้ในการบันทึกออปเจคที่สำคัญของ application ในที่ๆ ปลอดภัย
// และมั่นคง (ไม่อยู่ในส่วนที่เป็น global) เพื่อดึงเอามาใช้งานในอนาคต.
// เพื่อให้ application สามารถแน่ใจได้ว่าไม่ว่าอะไรจะเกิดขึ้นใน
// ส่วนที่เป็น global, ภายใน registry ยังคงมีออปเจคที่จำเป็นต้องใช้อยู่
$registry = Zend_Registry::getInstance();
$registry->configuration = $configuration;
$registry->dbAdapter = $dbAdapter;

// CLEANUP - ลบ items จากส่วน global
// เป็นการลบตัวแปร local ของ bootstrap จากส่วน global ของ script นี้
// (และทุกๆ scripts ที่เรียก bootstrap). ซึ่งจะทำให้เกิดการบังคับให้ดึงข้อมูล
// object ผ่านทาง Registry ของ Application เท่านั้น
unset($frontController, $view, $configuration, $dbAdapter, $registry);



พอดูไฟล์ bootstrap.php จบ ให้ย้อนกลับไปดูที่ไฟล์ index.php อีกทีครับ
ในไฟล์ bootstrap.php เราได้กำหนดตำแหน่ง directory ของ controller ด้วยคำสั่ง
$frontController->setControllerDirectory(APPLICATION_PATH . '/controllers');
ส่วนในไฟล์ index.php เราจะส่งต่อการทำงานไปให้กับ instance ของ front controller ด้วยคำสั่ง dispatch(); แบบข้างล่างนี้ครับ
Zend_Controller_Front::getInstance()->dispatch();

ไม่มีความคิดเห็น:

แสดงความคิดเห็น