แสดงบทความที่มีป้ายกำกับ zend framework แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ zend framework แสดงบทความทั้งหมด

วันอังคารที่ 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();

Zend Framework Quick Start เรียนรู้ Zend Framework Application ภายในชั่วโมงเดียว

เริ่มต้นไปดาวน์โหลดไฟล์มา 2 ชุดด้วยกันครับ จาก

ไฟล์ ZendFrameworkQuickstart-20080915.zip ....(1)
http://www.zendframework.com/docs/quickstart

แล้วก็ ZF 1.7 stable จาก ...(2)
http://www.zendframework.com/download/latest

ให้สมมุติว่า c:/www คือ document root ซึ่งจริงๆ อาจจะเป็น c:/appserv/www หรือ d:/www
แล้วแต่ว่าตอนแรกตั้ง config ไว้แบบไหนนะ

แตกไฟล์ (1) ไปไว้ที่ c:/www/quick (เปลี่ยนชื่อ ZendFrameworkQuickstart เป็น quick น่ะจะได้ใช้สะดวกๆ)
แตกไฟล์ (2) ไปไว้ที่ c:/www/zend (เปลี่ยนชื่อ ZendFramework-1.7.8 เป็น zend น่ะจะได้ใช้สะดวกๆอีกเช่นกัน)

จากนั้นไปที่ php.ini
เพิ่ม include_path (สะดวกดีไม่ต้องกังวลว่า zend จะอยู่ไหน)
include_path = ".;c:/www/zend/library"
อ้อแล้วก็ที่ php.ini ต้องแก้ไข short_open_tag จาก Off เป็น On ด้วยนะ

สิ่งที่จำเป็นอีกอย่างคือ appache จะต้องตั้ง config ให้ใช้ .htaccess ได้นะครับ
ถึงแม้ว่าปกติเค้าจะแนะนำให้เราตั้งโฟลเดอร์ public เป็น document root เพื่อป้องกันการเข้าถึงไฟล์ต่างๆ
แต่ในการทดสอบถ้าตั้ง public เป็น document root จะไม่สะดวกครับ จึงจำเป็นต้องแก้ไขไฟล์ดังนี้ครับ
ในไฟล์ c:/www/quick/public/.htaccess ให้แก้ไขบรรทัดที่เขียนว่า
RewriteRule ^.*$ /index.php [NC,L]
ไปเป็น
RewriteRule ^.*$ index.php [NC,L]

จากนั้นก็ restart server แล้วทดสอบที่ http://localhost/quick/public

ซึ่งจะมีเว็บเพจขึ้นมาแสดงข้อความ

Hello, from the Zend Framework MVC!
I am the index controllers's view script.


และมีลิงค์ guestbook ครับ แต่ถ้าเราคลิ้กไปจะเกิดข้อความ error

กลับไปที่ไฟล์ php.ini อีกครั้งครับ
ค้นหาบรรทัด
;extension=php_pdo.dll
และ
;extension=php_pdo_sqlite.dll
และจัดการเอาเครื่องหมาย ; ออกไปซะ

จากนั้น restart server ใหม่
ตอนนี้ http://localhost/quick/public/guestbook ก็สามารถใช้งานได้แล้วไม่มี error ครับ
ลองไปที่ http://localhost/quick/public/guestbook/sign จะเป็นการลงชื่อ guestbook ครับ
ซึ่งมี captcha มหัศจรรย์ไม่ใช่ไฟล์รูปภาพแต่เป็น ascii เรียงกันเป็นตัวอักษรครับ o_O!
และที่มหัศจรรย์กว่านั้นคือมันโคตรเบี้ยวเลยครับ อ่านไม่ค่อยจะออก เหอๆ

มีวิธีช่วยให้อ่านง่ายขึ้นคือ copy แล้วไป paste ที่กล่องด้านล่างนี้ครับ



จบ Zend Framework Quick Start ครับ มีคนเคยเขียนแบบละเอียดแล้วล่ะครับ
ผมเลยเขียนแบบไม่ละเอียดให้ดูบ้าง 555

http://www.zendframework.com/docs/quickstart
เริ่มต้นกับ zendframework
zendframework frameworkดีๆสำหรับ php

รายชื่อ Zend Framework Components

Zend_Acl


เป็น access controll list ( ACL ) แบบขนาดย่อมแต่มีความยืดหยุ่นสูง สำหรับการกำหนดสิทธิ.
โดยทั่วไป โปรแกรมจะใช้ประโยชน์จาก ACL เพื่อป้องกัน protected objects จาก requesting objects.
ในเอกสารของ ZF จะให้
resource - แทน object ที่จะถูกควบคุมการเข้าถึง
role - จะหมายถึง object ซึ่งจะร้องขอการเข้าถึง resource

Zend_Application


ช่วยให้บรรจุ configuration เริ่มต้นของโปรแกรมได้สะดวก จัดหาทรัพยากรที่นำกลับมาใช้ได้ใหม่
คลาสที่เรียบง่ายและมีความเป็นโมดูล และช่วยในการตรวจสอบ dependency. มันเอาใจใส่กับการสร้าง
environment ของ PHP และตั้งค่าช่วยในการทำให้โปรแกรม autoloding โดย default

Zend_Amf


ช่วยในการเชื่อมต่อกับ Adobe's Action Message Format (AMF)
, เพื่อให้ Flash Player ติดต่อกับ PHP ได้.
มันจัดสรรส่วนการทำงานส่วน gateway server สำหรับควบคุมการ request จาก Flash Player ไปยัง server
และเทียบเคียง request เหล่านั้นไปยัง object และ method ของ class และ callback function ที่ผู้เขียนโปรแกรมสร้างขึ้นมาเอง
การใช้งาน AMFPHP กับ ActionScript 2.0

AMF3 sepecification มีให้อ่านได้ฟรี, ซึ่งช่วยอธิบายให้ทราบว่ามีชนิดของ message อะไรซึ่งสามารถจะส่งไปมาระหว่าง
Flash Player และ server

Zend_Captcha


CAPTCHA เป็นคำย่อของ "Completely Automated Public Turing test to tell Computers and Humans Apart";
มันถูกใช้เป็นเป็นตัวตรวจสอบความสิทธิรูปแบบหนึ่ง เพื่อให้แน่ใจว่าผู้ที่ป้อนข้อมูลเข้ามาแต่ละครั้งเป็นมนุษย์ไม่ใช้โปรแกรมส่งข้อมูลอัตโนมัติ.
โดยทั่วไป, captcha จะถูกใช้พร้อม form กรอกข้อมูลซึ่งอนุญาตให้ใช้งานโดยไม่จำเป็นต้อง login เข้าสู่ระบบสมาชิก แต่คุณต้องการป้องการการส่งข้อมูลจาก spam

โค้ดตัวอย่าง captcha ที่เป็น text ธรรมดาๆ ครับ :)
จริงๆ ควรจะใช้ร่วมกับ Zend_Form นะครับ แต่เนื่องจากผมอยากให้มันดูธรรมดาๆ อันไหนเขียนแบบธรรมดาๆ ได้ก็เขียนแบบธรรมดาๆ ไปเลย

<?php
ini_set('include_path','.'.PATH_SEPARATOR.'c:\mydoc\testweb\zend\library');
require_once 'Zend/View.php';
require_once 'Zend/Captcha/Figlet.php';
require_once 'Zend/Session.php';
$view = new Zend_View();
$captcha = new Zend_Captcha_Figlet(array(
'name' => 'code',
'wordLen' => 6,
'timeout' => 30000
));
if (isset($_POST['captcha'])){
if ($captcha->isValid($_POST['captcha'])) {
echo 'correct!';
}else{
$msg=$captcha->getMessages();
echo current($msg);
}
}
$id = $captcha->generate();
echo '<span style="font-family:fixedsys">';
echo $captcha->render($view);
echo '</span>';
?>
<form action="?" method="post">
<input type="hidden" name="captcha[id]" value="<?php echo $id;?>" id="captcha-id" />
<input type="text" name="captcha[input]" id="captcha-input" value="" />
<input type="submit" value="test">
</form>


Zend_Pdf



<?php
header("Content-type: application/pdf");
ini_set('include_path','.'.PATH_SEPARATOR.'c:\mydoc\testweb\zend\library');
require_once 'Zend/Pdf.php';

$pdf1 = new Zend_Pdf();
$pdfPage = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4);
$pdfPage->setFont(Zend_Pdf_Font::fontWithPath('2005_iannnnnMTV.ttf'), 36);
$pdfPage->drawText('สวัสดีครับท่าน', 50, 842-50, 'UTF-8');
$pdf1->pages[]=$pdfPage;
echo $pdf1->render();


Zend_Soap_Client


อันนี้เป็นตัวอย่างการใช้งาน Zend_Soap_Client คนที่เคยใช้ dotnet xml จะทราบว่า xml ของ dotnet มันไม่ค่อย standard เท่าไหร่
คือ ' หรือ " มันจะไม่ถูกแปลงข้อมูลไปเป็น &quot; อะไรพวกเนี้ยลืมแระ และคิดว่า soap ของ dotnet ก็คงจะไม่ standard อีกเช่นเคย
Zend Framework ก็เลยสร้าง class Zend_Soap_Client_DotNet เสริมขึ้นมาจาก Zend_Soap_Client ธรรมดาเพื่อจัดการ xml format ของ dotnet โดยเฉพาะ ครับ :)
โปรแกรมนี้เรียกใช้ webservice จากเว็บ http://www.webservicex.com ครับ โดยอันนี้จะเป็น service แปลงอัตราแลกเปลี่ยนค่าเงินบาทกับเงินยูเอสดอลล่าครับ

<?php
ini_set('include_path','.'.PATH_SEPARATOR.'c:\mydoc\testweb\zend\library');
$wsdl = 'http://www.webservicex.com/CurrencyConvertor.asmx?wsdl';
require_once 'Zend/Soap/Client/DotNet.php';
$client = new Zend_Soap_Client_DotNet($wsdl);
$result = $client->__call('ConversionRate',array(
'FromCurrency'=>'USD',
'ToCurrency'=>'THB'
));
var_dump($result);
?>

โครงสร้าง MVC ของ Zend Framework

MVC


M (Model) คือเนื้อหาที่อยู่ใน application เช่น data, web service, rss feed
V (View) คือส่วนแสดงผลที่แสดงต่อผู้ใช้
C (Controller) คือส่วนจัดการกับการ request และควบคุมการทำงาน

Controller สามารถบอกให้ View แสดงผลต่างๆ ในแบบต่างๆ
View สามารถส่งข้อมูลไปให้กับ Controller

Controller สามารถดึงเอาข้อมูลจาก Model มาใช้ในการตัดสินใจต่างๆ
และสามารถส่งข้อมูลไปให้ Model เพื่อให้บันทึกข้อมูล

View สามารถเข้าถึง Model เพื่อดึงเอาข้อมูลมาใช้ แต่ไม่สามารถส่งข้อมูลเพื่อให้ Model บันทึกข้อมูล


Front Controller


จัดการกับการ requests
ส่งต่อการควบคุมให้กับ Action Controller
คืนค่า response

Zend_Controller


เกี่ยวกับ Controller
ในการสร้าง Action Controller เราจะสร้าง class ซึ่ง extends Zend_Controller_Action
ในการตั้งชื่อ class เราจะตั้งชื่อให้ลงท้ายว่า Controller ยกตัวอย่างเช่น IndexController
ตัวอักษร _ ในชื่อ class จะแทน subdirectory อย่างเช่น Test_MyController จะหมายถึง Test/MyController.php
URL ของ DoraemonNobitaController คือ /doraemon-nobita หรือ /doraemon.nobita หรือ /doraemonIndex

เกี่ยวกับ Action
คือ method ที่ controller นำมาใช้งาน
โดยจะต้องเป็น public method ที่มีชื่อลงท้ายว่า Action เช่น indexAction(), viewAction()
URL ของ magicItemAction() คือ /doraemon-nobita/magic-item หรือ /doraemon-nobita/magic.item หรือ /doraemon-nobita/magic_item

เกี่ยวกับ Modules
คือกลุ่มของ action controllers, models และ views ที่สัมพันธ์กัน
โครงสร้าง directory จะสัมพันธ์กับโครงสร้าง application directory
ชื่อคลาสของ Controller ควรจะนำหน้าด้วยชื่อ Module
  ยกตัวอย่างเช่น Cartoon_DoraemonController.php ซึ่งจะมีโครงสร้าง directory เป็น Cartoon/controller/DoraemonController.php
ชื่อของ Module จะต้องเป็น camel case เช่นเดียวกับชื่อของ Controller

Request Object  จะบรรจุข้อมูลเกี่ยวกับการ request เอาไว้ทั้งหมด
Router จะแยกข้อมูลจากการ request เช่น url ออกเป็น token ที่แสดงถึง action, controller และ module ของการ request
Dispatcher นำเอา token ที่ได้จากการ routing มาเป็นข้อมูลในการเลือก คลาส metod ของ action controller, จากนั้นจึงสั่งให้มันทำงาน
Response Object จะบรรจุข้อมูล response ที่สมบูรณ์ และมีความสามารถในการส่งข้อมูลกลับไปให้ user

Dispatch Loop

  1. Zend_Controller_Front::getInstance()->dispatch(); จัดการกับ request ที่เข้ามา

  2. สร้าง ออปเจค request และ ออปเจค response ถ้ายังไม่ได้ถูกสร้างขึ้น

  3. ทำการ route request

  4. เข้าสู่ dispatch loop

    • ในการ dispatch action ประกอบด้วยการสร้างออปเจค controller และการเรียก method ของ controller

    • ซึ่งจะทำการ dispatch ไปเรื่อยๆ จนกว่าออปเจค request จะรายงานกลับมาว่าไม่มี action ที่จะต้อง dispatch อีก



  5. คืนค่า response



Routing
default routing ได้แก่
/controller/action/key1/value1/key2/value2
/module/controller/action/key1/value1/key2/value2

การแก้ไข routing เรียกว่า Rewrite Router
Zend_Controller_Router_Rewrite คือส่วนการทำงานของ router ปกติ
อนุญาตให้เพิ่ม named route ได้มากเท่าที่ต้องการ
named route จะช่วยให้สามารถทำงานเกี่ยวกับการ route ได้ในภายหลัง การรวมกันเป็น URL
และการวิเคราะห์หาว่ามีข้อมูลอะไรบ้างที่อยู่ใน URL
การ Route ถูกประมวลผลแบบ LIFO (route ที่นิยามทีหลังสุดจะถูกประมวลผลเป็นอันดับแรก)
Route interface ช่วยให้คุณสามารถสร้างชนิดของการ route ที่จะใช้กับ application ของคุณได้เอง


ชนิดของ Route ที่ได้เตรียมไว้ให้
static: เทียงเคียงอย่างตรงไปตรงมา, ส่งต่อการทำงานสอดคล้องกับการ default route
standard: เทียงเคียงกับส่วนประกอบใน named URL, ยืดหยุ่นและอ่านได้ง่าย แต่ว่าแต่ะละส่วนประกอบจะต้องใช้ regexp ในการเทียบเคียงจึงทำงานค่อนข้างช้า
regex: เทียบเคียงโดยใช้ PCRE, มีความยืดหยุ่นสูงและเร็วกว่าแบบ standard แต่สร้างยากกว่าแบบ standard

ลองดูตัวอย่างการ route นะครับ อันนี้เป็น standard route
เมื่อเพิ่มโค้ดนี้ลงใน c:/www/quick/application/bootstrap.php นะครับ
(ก่อนคำสั่ง unset($frontController, $view, $configuration, $dbAdapter, $registry);)
ก็จะทำให้ http://localhost/quick/public/homepage ชี้ไปที่ controller index, action index ครับผม
หรือ http://localhost/quick/public/homepage ชี้ไปที่เดียวกับ http://localhost/quick/public ครับ

// Create a router
$router = $frontController->getRouter(); // returns a rewrite router by default
$router->addRoute(
'myRouteName',
new Zend_Controller_Router_Route('homepage',
array('controller' => 'index',
'action' => 'index'))
);

Action Controllers


คือคลาสที่ extends จาก Zend_Controller_Action
ใช้กำหนด public action (method ที่ลงท้ายด้วย Action) ที่ต้องการให้ controller ควบคุม
สร้าง public method ถ้าต้องการจะนำกลับมาใช้ใหม่ หรือหากต้องการให้ทดสอบโปรแกรมได้สะดวก

ใน Action Controller เราสามารถสร้าง method เพื่อ listen และแทรกคำสั่งใน event ต่อไปนี้
init(): method ที่จะถูกเรียกเมื่อ object ของ Action Controller ถูกสร้างขึ้น
preDispatch(): method ที่จะถูกเรียกก่อนการ dispatch action
postDispatch(): method ที่จะถูกเรียกหลังการ dispatch action

Utility Methods
_forward : ใช้เพื่อย้ายไปยัง action อื่น
_redirect : ใช้เพื่อย้ายไปยัง url อื่น
render : ใช้เพื่อเปลี่ยนไปใช้ view อื่นแทน default view
__call : สามารถ override method นี้เพื่อควบคุมการทำงาน undefined action ว่าจะให้ forward ไปยัง action ไหน

ViewRenderer


เป็น action helper ตัวนึงที่ ZF จะสร้าง object ขึ้นมาให้โดยอัตโนมัติ
property view ($this->view) ของ controller คือออปเจค view
เราสามารถกำหนดค่าตัวแปรให้ view โดยใช้คำสั่ง
$this->view->varname = $varname;

View Script จะถูกนำมาแสดงผลโดยอัตโนมัติหลังจาก event postDispatch()
view script จะมีชื่อตาม controller และ action
ตัวอย่างเช่น DoraemonController::showItemsAction จะมีไฟล์ view script คือ /view/scripts/doraemon/show-items.phtml
เราสามารถใช้คำสั่ง setNoRender() เพื่อบอกให้ controler ไม่นำ view script มาแสดงผลโดยอัตโนมัติ

คำสั่งเกี่ยวกับ ViewRenderer
setView
setViewSuffix
setView(Base|Script)PathSpec()
setResponseSegment()


Plugins


plugin จะถูกเรียกใน event ของ front controller
มีการแทรก event ในทุกๆ ขบวนการหลักของ front controller
ช่วยให้สามารถสร้าง action แบบ global (แทรกคำสั่งเพิ่มเข้าไปในทุกๆ action)

event
routeStartup(): ทำงานก่อนการ route
routeShutdown(): ทำงานหลังการ route
dispatchLoopStartup(): ทำงานก่อน รอบแรกของ dispatch loop
preDispatch(): ทำงานก่อนการ dispatch action
postDispatch(): ทำงานหลัง dispatch action
dispatchLoopShutdown(): ทำงานหลังจากที่ dispatch loop วนซ้ำจบ

การสร้าง plugins
ให้สร้างคลาส extends Zend_Controller_Plugin_Abstract
เขียน override event ลงใน คลาสดังกล่าว โดยอาจจะเขียนเพียง event เดียวหรือหลาย event ก็ได้


Action Helpers


Action Helper คือคลาสที่รวมเอา function ที่นำกลับมาใช้ได้ใหม่ในหลายๆ controller

การสร้าง Action Helper
สร้างคลาส extends Zend_Controller_Action_Helper_Abstract
ส่วนสุดท้ายของชื่อคลาสคือชื่อของ helper
ตัวอย่างเช่น My_Helper_SuperMan 'SuperMan' คือชื่อของ helper
สร้าง method direct() เพื่อให้ helper ถูกเรียกราวกับว่าเป็น mehod ของ helper broker

การใช้ Action Helper เป็น Action Controller Event Listener

init(): เมื่อ action controller ถูกสร้างขึ้น
preDispatch(): ทำงานหลังจาก preDispatch() ของ front controller plugins แต่ทำงานก่อน preDispatch() ของ action controller
postDispatch(): ทำงานหลังจาก postDispatch() ของ action controller แต่ทำงานก่อน postDispatch() ของ front controller plugins

โน๊ต : event listener ของ helper จะถูก trigger ก็ต่อเมื่อได้ทำการลงทะเบียนกับ broker


Zend_View


สร้างคลาสจาก Zend_View_Interface เพื่อสร้าง template engine ของคุณเอง
default คลาส Zend_View ใช้ ภาษา PHP เป็น template language
สามารถกำหนดค่าตัวแปร view ราวกับว่ามันเป็นสมาชิกของ object อย่างเช่น $view->varname = $varname;
ใช้งานตัวแปร view ใน view script ได้จากออปเจค $this ตัวอย่างเช่น <?= $this->varname ?>


View Helper


เป็นคลาสซึ่ง ขยายความสามารถให้กับ Zend_View
ตัวอย่างเช่นช่วย นำเข้า rss feed มายังเว็บเพจ
จัดรูปแบบ text ให้อยู่ในรูปแบบ xhtml
ช่วยแสดงผลตามเงื่อนไขที่ตั้งไว้อย่างเช่นแสดงผลปุ่ม login ถ้ายังไม่ได้ login
ส่วนแสดงผลที่สามารถนำกลับมาใช้หลายๆ ครั้ง เช่นกล่อง serach

การใช้ View Helper
เรียกใช้งาน Vew Helper ราวกับว่ามันเป็น method ของออปเจค View
<?= $this->formText('username') ?>

การสร้างและใช้งาน View Helper
ชื่อคลาส My_View_Helper_Coffee จะมีชื่อ helper เป็น coffee
ลงทะเบียน helper paths กับออปเจค Zend_View

จะต้องมีชื่อ method ชื่อเดียวกับ helper ดังนี้

<?php
class My_View_Helper_Coffee
{
  function coffee(){
  }
}
?>


View Filter


ช่วยในการกรอง content ก่อนจะนำไปแสดงผลจริงๆ
เหมือนกับ View Helper คือจะต้องสร้างคลาสซึ่งมี 1 method ต่อ 1 class
ประโยชน์ของ Filter เช่นแปลง HTML เป็น PDF, JSON, ลบแท็ก script ออกไปจาก content

Zend_Model


ตัวอย่างของ Model ได้แก่ Database, Web Service, RSS Feeds, FileSystem, Images

Zend Framework ระบุถึง Model ได้อย่างไร
ZF ยังไม่ได้สร้าง Model ที่เป็นแบบทั่วไปขึ้นมา
แต่ ZF สนับสนุน Model ที่มีความเฉพาะเจาะจงตัวอย่างเช่น Zend_Db_Table, Zend_Service, Zend_Feed


reference
Ophinney_Matthew_2007-ZendCon-MVC.pdf