เอา Zend Framework มาใส่ Codeigniter Framework เพื่อใช้ Zend Component

entry นี้ผมกะจะเขียนตั้งนานแล้ว แต่ว่าไม่มีโอกาสเสียที วันนี้เลยเอาสักหน่อยครับ

ผมไม่เท้าความว่า Codeigniter Framework คืออะไร หาอ่านกันเอานะครับ ติดตั้งอย่างไร เขียนยังไง ทำงานอย่างไร อันนี้หาเอาได้ในเว็บต่างๆ ทั้งไทยและเทศ ผมว่ามีเยอะ ผมลุยเรื่องปรับแต่งเพิ่มเติมเลยดีกว่า

เหตุผลที่เอา Component ของ Zend Framework (ต่อไปเรียก Zend) มาใช้ใน Codeigniter (ต่อไปเรียก CI) เพราะความครบเครื่องในการนำไปใช้งาน ที่หลายๆ อย่างทำได้ดีกว่าตัว CI เยอะมาก แต่โครงสร้างและติดตั้งของ Zend ทำได้ยุ่งยากกว่า ผมเลยเอามาผสมกัน หากใครใช้ Zend มาบ้างจะทราบดีว่ามันอลังการงานสร้างแค่ไหน ครบเครื่องอย่างไร

เอาหล่ะ ไม่พูดอะไรมาก ก่อนอื่นสร้างไฟล์ที่ path ตามด้านล่างครับ

system/application/libraries/Zend.php

ภายในไฟล์ก็ประกอบด้วยโค้ดตามด้วยล่างครับ

<?php
class CI_Zend {
    function __construct ($class = NULL) {

        ini_set('include_path',  ini_get('include_path') . PATH_SEPARATOR . APPPATH . 'libraries');

        if ($class) {
            require_once (string) $class . EXT;
            log_message('debug', "Zend Class $class Loaded");
        } else {
            log_message('debug', "Zend Class Initialized");
        }
    }

    function load ($class) {
        require_once (string) $class . EXT;
        log_message('debug', "Zend Class $class Loaded");
    }
}

โดยเมื่อได้ไฟล์ Zend.php แล้ว ให้เอา Directory “Zend” ทั้งหมดไปใส่ที่

system/application/libraries

เวลาใช้งาน ก็ใช้งานผ่าน Controller ของ CI โดยมี 2 แบบคือ

  1. โหลด Library Zend ที่เขียนสำหรับตั้ง include path ไปพร้อมๆ กับโหลด Component ไปด้วยเลย
$this->load->library('zend', 'Zend/Package/Name');
  1. โหลดตัว Library Zend ที่เขียนสำหรับตั้ง include path ก่อน แล้วค่อยโหลดตัว Component ทีหลังเป็นตัวๆ ไปก็ได้
$this->load->library('zend');
$this->zend->load('Zend/Package/Name');

การโหลด Zend Component แบบนี้ก็ทำให้ดูเป็นระเบียบกว่าการ require_once เข้ามา เพราะอย่างน้อยก็ทำให้เราทำ logs tracking ใน CI ได้ครับ รวมไปถึงการตั้ง include path เพื่อโยกย้าย Zend Framework ไปที่ไหนๆ ก็ได้ตามแต่เราตั้งใน include path โดยไม่ต้องอ้างอิง include path ของ System

เพียงเท่านี้เราก็ลั้นล้ากับ Zend ใน CI ได้สบายใจแล้วหล่ะครับ ;)

/*p0rt80 BKK*/ – PHP Day

ด้วยความร่วมมือจาก Narisa.com, ThaiAdmin.org, Blognone.com, ThaiThinkPad.com และ ไมโครซอฟท์ (ประเทศไทย) เราขอเชิญเพื่อนๆ ชาว Dev และเพื่อน ๆ ใน Community (คุณนั่นแหละ) และบุคคลที่สนใจ มาพบปะสังสรรค์แลกเปลี่ยนประสบการณ์กัน ในงาน /* pOrt80 BKK */ ซึ่งเป็นงานที่ว่ากันด้วยเรื่องการพัฒนา App โดย PHP และ Open source ต่าง ๆ เพื่อใช้ในงานประจำวันของเรา นอกจากเพื่อน ๆ ที่อาสาเป็น Speaker ในงานเช่น คุณสมเกียรติ ปุ๋ยสูงเนิน : [Narisa.com: Up1] คุณมหศักดิ์ พิจิตรธรรม (ZCE:214599205) : [Narisa.com : Zelda] เรายังได้เชิญตัวแทนจาก Zend Technologies ประเทศสิงคโปร์ มาพูดคุยเรื่องราวเกี่ยวกับ Framework, Roadmap และได้เชิญผู้คร่ำหวอดในวงการ PHP ที่ตั้งบริษัทของตัวเองจนประสบความสำเร็จมามาแบ่งปันประสบการณ์ว่าท่านเหล่า นั้นทำได้อย่างไร อีกทั้งยังมี คุณวสันต์ ลิ่วลมไพศาล ผู้ก่อตั้งเว็บไซต์ Blognone.com มาแชร์ความรู้ในการเข้าถึงข้อมูลได้ง่ายกว่าด้วย PHP Data Object พร้อมด้วยกูรูจาก Ford AntiTrust มาเล่าเรื่องราวของ PHP Performance with APC + Memcached

ในงานไม่ใช่จะแต่สาระเพียงอย่างเดียว ยังมีความบันเทิงพบปะเพื่อนใหม่ พร้อมรับของที่ระลึก
ให้กลับบ้าน มาเถอะครับ กระชับวงล้อม ขยับเข้ามาช่วยกันสร้างชุมชนที่มีแต่มิตรภาพกันครับ

งานนี้เหมาะกับใคร ?

  • ผู้สุงวัยชาว PHP ที่ต้องการถ่ายทอดประสบการณ์
  • ชาว PHP ที่ต้องการหาอะไรใหม่ ๆ มาช่วยให้งานดูดี
  • มือใหม่ บุคคลที่สนใจ
  • นักศึกษาที่กำลังหาแนวทางในการทำ Senior Project หรือ กำลังงงว่าจะไปทางไหนดี
  • ชาว Dev ไม่มีที่จะไปและไม่มีใครชวนไปไหนในวันอาทิตย์

วันและสถานที่จัดงาน

วันอาทิตย์ ที่ 19 กันยายน พ.ศ. 2553
เวลา 9.00 ถึง 17.15 น. (ลงทะเบียนเวลา 9.00 ถึง 9.30 น.)
ชั้น 38 บริษัท ไมโครซอฟท์ (ประเทศไทย)

ค่าใช้จ่ายและการลงทะเบียน

ฟรี! ตลอดงานครับ มาแต่ตัวกับหัวใจ เราเตรียมอาหารกลางวันรสดี กาแฟรสเลิศ ของเสริฟในยามว่าง เราเตรียมไว้ให้ตลอดงานครับ ร่วมลงทะเบียนเข้างานเพื่อรับของที่ระลึกเก๋ ๆ ได้ที่นี่ครับ

หัวข้อภายในงาน

  • PHP Roadmap
    โดย Mr. Rama Yurindra, Zend Technologies Representative, Singapore
  • ธุรกิจสิบล้านกับงาน PHP แบ่งปันประสบการณ์ดี ๆ จากคนคอเดียวกัน
    ว่าสามารถสร้างธุรกิจให้ประสบความสำเร็จจาก PHP ได้อย่างไร

    โดย คุณศุภโชติ กาญจนกรทอง ผู้ก่อตั้งบริษัท 2Fellows Network and Design
  • Exploring a power of SQL Server and PHP
    โดย คุณฟูเกียรติ จุลนวล (Narisa.com: Fuju)
  • สร้างระบบ e-commerce ด้วย CodeIgniter
    โดย คุณสมเกียรติ ปุ๋ยสูงเนิน (Narisa.com: Up1)
  • PHP in Enterprise
    โดย คุณมหศักดิ์ พิจิตรธรรม (ZCE:214599205) : (Narisa.com : Zelda)
  • PHP Performance with APC + Memcached
    โดย Ford AntiTrust (Web Developer/Consultant, Database Consultant, Ubuntu Implementer, Blogger and Photographer)
  • เข้าถึงข้อมูลได้ง่ายกว่าด้วย PHP Data Object
    โดย คุณวสันต์ ลิ่วลมไพศาล ผู้ก่อตั้งเว็บไซต์ Blognone.com
  • Update Web Platform Installer และ Resource ฟรี ๆ
    จาก ไมโครซอฟท์ (ประเทศไทย)

    โดย คุณสงวน ธรรมโรจน์สกุล

รายละเอียดเพิ่มเติมอ่านได้ที่ http://www.microsoft.com/thailand/seminar/FY11Q1_port80bkk/

กรี๊ดดดด ได้ Zend Studio version 7.0 มาใช้ฟรี

ไม่รู้ไปทำบุญที่ไหนมา ได้ใช้ Zend Studio version 7.0 พร้อม support ฟรีอีก 36 เดือน (3 ปี) ราคา Zend Studio – 3 years of upgrade and support ก็ $ 717.00 ครับ

อาจจะเพราะผมไปร่วมด้วยช่วยกันทดสอบ Zend Web Application Server ที่ชื่อ “Zenith” เมื่อกลางปีที่แล้วก็ได้มั้ง ก่อนที่จะออกมาเป็น Zend Server ตัวล่าสุดนี้ (มี Version CE ด้วยนะ ไปลองโหลดมาใช้ดู ลองแล้วปรับแต่งและรวดเร็วใช้ได้เลย)

2009-08-19_065757

image

ความคืบหน้า PHP Hoffman Framework

  • ทำการ redesign ตัว clean url ใหม่อีกรอบ ด้วยการกลับมาใช้แบบเดิมเมื่อตอนออกแบบครั้งแรกคือ controller/action แทน ส่วนต้องการแก้ไข url ใหม่ ก็เพิ่มลงไปใน xml เอา โดย default คือ <map pattern=”:controller/:action” /> ถ้าต้องการใช้ user/login เป็น login เฉย ๆ ก็ <map pattern=”login” action=”user/login” /> แทนซะ หรือถ้าต้องการ rewrite ตัว url ที่มีการส่ง value ด้วยก็ <map pattern=”news” action=”page/show/1″ /> แทนก็ได้เช่นกัน โดยในรุ่นต่อไปจะมี plugin เสริมสำหรับการ hook ตัว xml ตัวนี้ให้ไปใช้ database ได้ แบบเดียวกับ drupal แทนช้าลงและโหลด db มากขึ้น กำลังจุดลงตัวในส่วนนี้ โดย clean url นี้มีประสิทธิภาพเพิ่มขึ้นเยอะกว่าเดิมมาก และลดความซับซ้อนในการตั้งค่าลงไปเยอะด้วย แต่ต้องแลกกับความยืดหยุ่นบางส่วนไป แต่ถ้าว่า ok กว่าเดิมมาก ๆ ในตอนนี้
  • หน้า error handler page นั้น ok แล้ว เพื่อดักข้อผิดพลาดในกรณีไฟล์ของ controller หรือ view ไม่มี รวมถึง arguments ไม่ครบเมื่อ controller ไป handle ตัว action
  • ตัว config ไฟล์ใน .ini file และสามารถทำ inherit config ได้ด้วย เช่น
[production]
database.default.type=mysql
database.default.hostname=localhost
database.default.username=root
database.default.password=1234
database.default.name=album

[development : production]
database.default.hostname = localhost
database.default.username = root
database.default.password = 1234
  • เมื่อเราเลือก production เป็น environment มันจะไปดึงตัว config มาของ production มา แต่ถ้าใช้  development ก็จะไปดึงส่วนของ development ที่ override ตัว production มาใช้เท่านั้น ทำให้ลดการตั้งค่าลงไปเยอะ
  • ในส่วนของ Model layer มี 3 ทางเลือกให้ extends มาใช้งานได้ คือ Zend_Db, Doctrine หรือ LogicModel (ตัวนี้ผมเขียนเอง สนับสนุนแค่ MySQL เท่านั้น) โดยใครถนัดแบบไหนก็ใช้แบบนั้นได้เลย เพียงแค่ตั้งค่าใน Model แต่ละตัวว่าจะใช้แบบไหน กำลังหาจุดลงตัวเพื่อให้เราสามารถใช้ Model ได้หลากหลายรูปแบบการ extends จาก 3 ทางเลือก บางครั้ง Model บางตัวอาจจะเหมาะกับ Doctrine มากกว่า 2 ตัวที่เหลืออะไรแบบนั้น และอาจจะรองรับการเขียนด้วย function mysql(i) เดิม ๆ ได้ด้วย โดยผมมองว่า Model นั้นเป็น Business logic ซึ่งควรมี performance สูงที่สุดในการเขียนและนำไปใช้งานครับ
  • การส่งข้อมูลจาก controller ไปหา view นั้นใช้การ return ของ action ใน controller นั้น โดยการส่งข้อมูลแบบตัวแปรเดียวก็ได้ หรือส่งเป็น array ออกไปก็ได้ โดยส่งเป็น array จะทำการ fetch ข้อมูลให้ชั้นนึงเพื่อส่งผ่านเป็นตัวแปรนึงใน view ให้เลย โดยใช้การ map key เป็นชื่อตัวแปรใน dimension ที่ 1 ของ array ซะ
  • พยายามเอา ORM หลาย ๆ ตัวมาใช้ร่วมกันใน Model เพื่อลดการยึดติดของระบบกับรูปแบบ ORM ของตัวใดตัวหนึ่ง
  • ยังคงใช้ Zend แบบหลักในการพัฒนาระบบภายในเช่นเดิม

ตอนนี้โดยรวมพยายาปั้นตัวแรกออกมาให้ได้ก่อน เพื่อเอามารับคำติของทุกท่านครับ เพื่อเอามาพัฒนาต่อไปครับผม

กำลังเตรียมตัวไปงาน BarCamp Bangkok Winter 2008

image

งาน BarCamp Bangkok Winter 2008

จัดในวันที่ 26 มกราคม 2551 โดยจัดที่ร้านอาหาร Indus แถวสุขุมวิท บรรยากาศดีเยี่ยม งานเริ่มตั้งแต่ 10 โมงเช้าจนถึง 6 โมงเย็น แล้วมีปาร์ตี้ข้าวเย็นกันต่อตอนช่วงค่ำ

ตอนนี้กำลังปั่นตัว slide ที่จะเอาไปพูดในงาน 2 ตัว (ในรอบเดียว)

  1. MySQL Tuning นี่คงเอาเนื้อหาเดียวกับที่เคยได้โพสใน entry เก่าไปแล้ว แต่เพิ่มเติมและใส่ประสบการณ์ตรงของตัวเองลงไป
  2. PHP Framework ผมคงไม่พูดถึงตัวอื่นมาก เอาแค่ intro พอนิด ๆ แต่เอา PHP Hoffman Framework (HMF) ไปแสดงก่อน

ซึ่งตัว PHP Framework ของผมเนี่ย ตอนนี้ก็ปั่นตัว implementation code อยู่ ไม่รู้จะทันหรือเปล่า แค่ทำ Routing URL กับพวก Standard Code ต่าง ๆ ใหม่หมดก็เล่นซะหลายวัน รวมถึง Directory structure ก็เพิ่งจะลงตัวไป น่าจะเข้ารูปเข้ารอยในไม่ช้านี้ หลาย ๆ ภายใน Framework ยังไม่นิ่งพอจะเป็น Alpha version ได้ด้วยซ้ำ แถมหลายอย่างที่อยู่ใน 0.1a (ตัวใหม่ผมเรียกมันว่า Rv2 หรือ revolution version 2) ไม่ได้โอนถ่ายมาใส่อีกด้วย เพราะซ้ำซ้อน กับ Zend Components ที่จะเอามาใช้อยู่หลายตัวอย่าง ACL ที่ทำเองใน 0.1a พอมาตัวใหม่นี้ ใช้ Zend_Acl ของ Zend Framework แทน และหลาย ๆ ตัวที่โยกมาใช้ Zend แทนหลายตัวเลย รวมถึงตัว Model ที่ใช้ความสามารถของ Doctrine และ Zend_Db แทนที่ตัว Components ของผมเอง แต่ว่าตัวที่ผมใช้อยู่ก่อนหน้านั้นก็ยังคงมีอยู่ เหมือนเดิม เพียงแต่ไม่ได้เปิดใช้เท่านั้นเอง ส่วน Controller นี่เขียนเองหมดเลย Flow ตัว Controller ต่าง ๆ จัดการเองหมด รวมถึง Standard Structure และ Code ต่าง ๆ ส่วนของ View ก็ใช้ Smarty เข้ามาแทนของเก่าของผมเองทั้งหมดเลย

ตอนนี้ที่ตัดสินใจไว้ทั้ง 3 components หลัก ๆ ก็คือ

LogicModel ใช้ความสามารถต่าง ๆ จาก Doctrine และ Zend_Db และพวก tools ด้าน Business Logic ทั้งหมด
FlowController อันนี้เขียนเองทั้งหมดเพราะหาตัวที่มันโดนใจไม่ได้ ฮา …
RenderView ใช้ความสามารถต่าง ๆ ของ Smarty มาช่วยในส่วนนี้

เพราะเท่าที่หาข้อมูลและ defend กับตัวเองแล้วหลาย ๆ อย่างน่าจะใช้สิ่งที่มีอยู่และนำมาปรับให้เข้ากับแนวทางของ Framwork ของเราเองหลาย ๆ ตัวน่าจะทำให้มันง่าย ๆ เข้าไว้ด้วย Framework บางตัวทำเรื่องง่าย ๆ ให้เป็นเรื่องยากไปซะงั้น บางตัวทำงานไม่ยืดหยุ่นอะไรแบบนั้นอีก เลยทำเองซะ แล้วให้คนอื่นมา defend กับเราว่าควรปรับอะไรอีกบาง

หลาย ๆ อย่าง หลาย ๆ idea มาจากหลาย ๆ Framework มาปรับใช้เข้าด้วยกันบางอย่าง idea ดีมาก ๆ น่าจะทำให้มันทำงานได้ง่าย ขึ้นพอสมควร

แล้วเจอกันที BarCamp ครับ