Zend Framework 2.0 ออกตัว Stable แล้ว!

หลังจากที่ Zend Framework ออก version 1.0 ออกมาเมื่อปี 2007 ผ่านมา 5 ปี วันนี้ก็ได้เวลาของ version 2.0 เสียที จาก Zend Framework 2.0.0 STABLE Released! และ Changelog: 2.0.0 ผมสรุปสั้นๆ ตามนี้

ใน Zend Framework 2 มีทีมพัฒนาจาก Google, Microsoft, StrikeIron และ partner ต่างๆ มากมายเข้าร่วมพัฒนาเพื่อสร้าง API ติดต่อกับ Web Services ของตัวเองให้ดีมากขึ้น

การเปลี่ยนแปลงใน Zend Framework 2 นั้นมีดังต่อไปนี้

  • สนับสนุน PHP 5.3 ขึ้นไป เพราะใช้ namely namespaces, late static binding, lambda functions และ closures มาพัฒนา เพราะฉะนั้นได้เวลาเรียนรู้กันแล้วครับ (จริงๆ มันควรจะเริ่มกันนานแล้วนะ)
  • 100% Object-oriented code และ Component designed (dependencies on other component) ตอนนี้แยกเดี่ยวๆ ได้ดีมากขึ้น
  • รองรับ Pyrus, Composer, PHPUnit และ Travis CI เพื่อช่วยพัฒนาตัวเว็บ

มี Key Feature ส่วนของ Component ใหม่คือ

  • ModuleManager
    This new module system is designed with flexibility, simplicity, and re-usability in mind
  • ServiceManager
    The Service Locator is a service/object locator, tasked with retrieving other objects.
  • EventManager
    Component designed for the following use cases
    – Implementing simple subject/observer patterns.
    – Implementing Aspect-Oriented designs.
    – Implementing event-driven architectures.

ได้เวลาลองของใหม่แล้วครับพี่น้อง!!!!

Read more

PHP Hoffman Framework ย้ายจาก SourceForge สู่ Google Code Hosting

หลังจากใช้ SourceForge(Hoffman Framework:HMF) มาได้ระยะหนึ่ง ก็ใช้งานได้ดี แต่ช้า ๆ อืด ๆ แถมใช้งานยากพอสมควรเลย แต่เมื่อวานซืนได้ลอง Google Code Hosting และติดใจในความง่ายในการใช้งานอย่างมาก ซึ่งอย่างน้อย ๆ ก็ง่ายกว่าของ SourceForge อย่างมากเลยทีเดียว แถมเร็วกว่าอีกด้วย เลยไม่มีข้อโต้แย้งใด ๆ ในการที่จะไม่ย้ายมาใช้ที่นี่ และด้วยอีกเหตุผลคือมันสามารถเอาไปใช้ร่วมกับบริการต่าง ๆ ของ Google อย่าง Groups, Analytic และ Gmail ได้อย่างง่ายดาย ตอนนี้ผมย้ายมาแล้วที่ hoffmanframework แทนแล้วเรียบร้อย ปรับแต่งและ import ตัว code ลงไปใหม่แล้ว กำลังไล่ทำเอกสารทั้งหมดอยู่ครับ ส่วนที่ SourceForge นี่อีกสักพักจะลบ project ออกจากที่นั้นครับผม (เราจะไม่ลืมนาย SourceForge)

ความคืบหน้าของ Hoffman Framework นับจาก 0.1.3a

ตอนนี้ผมเอา Framework ตัวนี้ไปใช้กับ production project หลาย ๆ ตัวและได้มีการปรับเปลี่ยนส่วนของ lib เยอะพอสมควร จนหลาย ๆ อย่างที่ทำได้ใน 0.1.3a นั้นทำงานไม่ได้เมื่อใช้กับ code ชุดใหม่นี้ครับ

หลายส่วนถูกโย้กย้ายด้วยเหตุผลด้านความยืดหยุ่น หลายส่วนถูกแก้ไขด้วยเหตุผลด้าน Coding Style Guideline โดยหลาย ๆ จุดถูกเพิ่มเติมเพื่อทำการ track ปัญหาออกมาได้ด้วยการตั้งค่าในไฟล์ Configuration เพื่อง่ายต่อการตรวจสอบ และบางส่วนถูกปรับแก้ด้วยเหตุผลด้านความเร็ว และประสิทธิภาพที่สูงขึ้นด้วย

ใน log ของ SVN บน SourceForge นั้นบางส่วนอาจจะขาดตกไปบ้าง เพราะว่ายังมือใหม่ในการบันทึกข้อมูลทั้งหมดที่ทำลง log ของ SVN ครับ พยายามเก็บรายละเอียดทั้งหมดที่ได้ทำ เพื่อเอาไว้อ้างอิงในภายหลังให้มากที่สุดครับ

และสุดท้าย คาดว่าจะเปลี่ยนจาก SourceForge มาใช้ Google Code Hosting ครับ กำลังดูเรื่องคุณสมบัติต่าง ๆ อยู่ครับผม

  1. rv 8  - f - ส่วนของการสลับ Profile ของฐานข้อมูลใน Hmf_LogicModel_Db ให้ย้ายมาอยู่ที่ __construct แทน
  2. rv 9  - a - เพิ่ม quoteInto เข้าไปใน Hmf_Logic_Model_Db เพื่อใช้ในการ filter ข้อมูลที่ใช้ใน Database
  3. rv 10 - e - แก้ไขตัวแปรสำหรับ config ค่าแบบทั่วไป และการเข้าถึง
  4. rv 11 - e - แก้ไขตัวแปรสำหรับ routing ค่าแบบทั่วไป และ config โดยใน config เพิ่มตัวควบคุมการใช้ acl ลงไป และ ตั้งแต่ rv 10 ตัวแปรตั้งค่าทุกตัวใช้การขึ้นต้นด้วยตัวเล็กทั้งหมด
  5. rv 12 - e - ปรับเปลี่ยนการใช้งานตัวแปรใน runtime ต่าง ๆ ให้ไป register ใน registry แทนเพื่อใช้แทนการเข้าถึงแบบ global แทนโดยมีชื่อตัวแปรดังต่อไปนี้ที่ได้รับการใส่ลงใน registry
  6. rv 12 - e - -- applicationConfigurations เป็น app_config
  7. rv 12 - e - -- applicationLocale เป็น app_locale
  8. rv 12 - e - -- applicationAcl เป็น app_acl
  9. rv 12 - e - -- applicationAuthen เป็น app_authen
  10. rv 12 - e - -- viewsInformations เป็น app_viewinfo
  11. rv 12 - e - -- routingUrl เป็น routing_url
  12. rv 12 - e - -- controllerFile เป็น controller_file
  13. rv 12 - e - -- controllerName เป็น controller_name
  14. rv 12 - e - -- actionName เป็น action_name
  15. rv 12 - i - -- routing ชื่อคงเดิม
  16. rv 12 - i - -- acl ชื่อคงเดิม
  17. rv 12 - i - -- is_production ชื่อคงเดิม
  18. rv 12 - e - ทำการ register $routes [':args'] ลงใน registry ในชื่อ action_args
  19. rv 12 - e - ทำการเปลี่ยนการ instance จาก Class ชื่อ Hmf_RenderView แล้วอ้างอิงในชื่อ $renderView มาเป็น register ลงใน registry ในชื่อ renderview
  20. rv 12 - e - แก้ไข Class ชื่อ Hmf_Config เพื่อให้ register ข้อมูลลงใน app_config และ app_locale ในคราวเดียวโดยซ่อนขั้นตอนภายใน method เลย
  21. rv 12 - a - เพิ่ม method _registry ลงใน Hmf_RenderView_Render และ Hmf_FlowController เพื่อนำข้อมูลใน register เข้าและออกมาผ่าน method _registry ได้เลย
  22. rv 12 - e - ย้ายขั้นตอนการตรวจสอบสิทธิ์ และกำหนดสิทธิ์ผู้ใช้จากใน runtime มาอยู่ใน constructor ของ Hmf_FlowController แทน
  23. rv 12 - a - เพิ่ม key 'acl' ในตัวแปรก config เพื่อกำหนดว่าจะใช้การตรวจสอบสิทธิ์หรือไม่
  24. rv 13 - r - เอา flag การตรวจสอบ registry ออกจากบรรทัดล่างสุด
  25. rv 14 - a - เพิ่ม method _registry ลงใน Hmf_LogicModel Hmf,_LogicModel_Db และ Hmf_LogicModel_General ผ่าน __call method
  26. rv 14 - a - ตรวจสอบ index ของ registry ก่อนทำการ access ออกมาใช้งาน
  27. rv 15 - a - เพิ่มขั้นตอนการตรวจสอบ verion ของ Zend Framework โดยต้องใช้ Zend Framework ใน version 1.5 เป็นต้นไป
  28. rv 16 - f - จัดรูปแบบของ code โดยทั่วไป
  29. rv 17 - e - เพิ่ม PATH_DIR_HTML เพื่อใช้แทน /html โดยใช้สำหรับในกรณีที่ต้องการเปลี่ยนชื่อ /html เป็นอย่างอื่น
  30. rv 17 - a - เปลี่ยนชื่อ $path_root เป็น $pathRoot เพื่อให้ตรงตาม naming ของ coding style guideline
  31. rv 18 - a - เพิ่ม debug.routing ลงใน key ของ config เพิ่มนำไปตรวจสอบเวลา debug ตอนทำ routing ใน Runtime
  32. rv 19 - a - เพิ่ม debug.routing ลงใน key ของ config เพิ่มนำไปตรวจสอบเวลา debug ตอนทำ routing ในไฟล์ Configuration
  33. rv 20 - f - แก้ไขข้อผิดพลาดในการใส่ keywords เพิ่ม
  34. rv 20 - f - ปรับประสิทธิภาพในการสร้าง url ให้ดีขึ้น และรองรับการใส่ keywords เพิ่ม
  35. rv 20 - f - แก้ไขการ handle ที่ controller และ action ใหม่
  36. rv 20 - r - เอา filterSlashAtLastChar ออก
  37. rv 20 - r - เอา getUrlWithString ออก
  38. rv 21 - f - แก้ปัญหา kerwords, pattern และ action หายในบางครั้งเวลา generate url
  39. rv 22 - a - เพิ่มค่า routing.cache.lifetime และ routing.cache สำหรับตั้งค่าใช้งาน cache ของ routing
  40. rv 23 - e - เอาการตรวจสอบการ debug ของ routing ไปใส่ใน contructor แทน
  41. rv 23 - e - เปลี่ยนชือการ debug ของ routing จาก debug.routing เป็น routing.debug แทน
  42. rv 23 - a - เพิ่มค่า routing.cache.lifetime และ routing.cache สำหรับตั้งค่าใช้งาน cache ของ routing
  43. rv 23 - a - เพิ่ม cache ลงใน routing โดยใช้ sqlite
  44. rv 24 - f - แก้ไขการขึ้นบรรทัดใหม่ใน error messege

Hoffman Framework ใกล้ความจริงแล้ว

หลังจากพลัดผ่อนมานานมาก ๆ เพราะเปลี่ยนงาน และไล่งานที่ตัวเองทำอยู่หลายตัว ตอนนี้กำลังปล่อยตัว pre-alpha (alpha version) ออกมา ตอนนี้ผมใส่ tag เป็น 0.1.3a แล้วครับ เอา source ขึ้น sourceforge.net/projects/hmf/ แล้ว บนเครื่องผม revision ซัดไป 140 กว่า ๆ แล้ว และ tag อีก 4 ตัว แต่บน sourceforge นี่เป็นตัวที่ทดสอบว่า ok แล้วคือ 0.1.3a นั้นเองครับ แต่ต้องมีการปรับปรุงอีกหลายส่วนครับ และยังไม่ได้ทำ documents มากนักครับ ตอนนี้คงได้แต่เอาไป review code มากกว่า ไม่ได้เอาไปใช้งานจริง ๆ แล้วเดี่ยวจะมีตัว demo ที่คาดว่าจะเอามาให้ดูเป็นตัวเอย่างพร้อม ๆ กับ documents ครับ ในตัว code นั้นบางส่วนไม่ได้เขียน docs comment และบางตัวยังไม่ได้ทำ test ครอบคลุมทุกด้านครับ

โดยผมจะทำ docs API ให้ด้วยครับ รออีกสักพักนึงนะครับ ไม่น่าเกิน 1-2 อาทิตย์นี้ หรือหลังสงกรานต์นี้แหละครับ คงได้ออก alpha ตัวเต็ม ๆ พร้อม docs API ที่ดีขึ้นกว่านี้เยอะครับ

สรุปคือตอนนี้มาบอกเฉย ๆ แหละครับว่าเอาขึ้น public แล้ว แหะ ๆ ๆ ;P

Hoffman Framework เอา Smarty ออกจาก Components หลักแล้ว

ช่วงนี้ไม่ได้บอกถึงความเปลี่ยนแปลงของ Framework ตัวนี้เลยเกือบ ๆ เดือน เพราะว่าผมเปลี่ยนงานใหม่ครับ เลยต้องนั่งเคลียร์งานที่ค้างกับบริษัทเก่า เลยแทบไม่ได้จับเลย แต่ก็หาเวลาว่ามานั่งไล่ดูระบบภาพรวมโดยทั้งหมด สิ่งที่ผมเปลี่ยนแปลงตัวระบบ runtime มากที่สุดครั้งหนึ่งในการทำ Framework ตัวนี้คือเอา Smarty ออกไป (แต่ถ้าอยากเอากลับมาก็ทำได้ไม่ยาก เดี่ยวจะเขียนวิธีการอีกทีนึงสำหรับคนที่อยากเอา Smarty หรือ Template-engine ตัวอื่น ๆ มาใส่) ซึ่งตัวโครงสร้าง RenderView นี่ไม่ได้เปลี่ยนแปลงอะไรมาก นอกจากเอา Smarty ออกไป และสร้าง method ที่ render ของตัวเองมาอีก 2-3 ตัวเท่านั้นเอง เลยเอากลับมาใส่ได้ไม่ยากครับ

เหตุผลที่เอาออกไปเนื่องจากมันไปหยุดวิธีการทำงานของแนวคิด php เดิม ๆ ไปไว้ฝั่ง designer และทำให้ learning curve ของทั้งฝั่ง developer และ designer เพิ่มมากขึ้น เพราะ Smarty มี syntax เป็นของตัวเอง และสิ่งที่ทำให้ผมรู้สึกว่าต้องเอาออกจริง ๆ นั้นคือการสร้าง Helpers ของ RenderView ที่ยากกว่าปกติมาก ๆ -_-‘ การ register function/class/object/class->method เข้าไปเป็น function/modifier ต่าง ๆ พวกนี้ทำได้ยาก และงงสุด ๆ ซึ่งจริง ๆ มันก็ไม่ยากหรอกครับ แต่ว่ามันเสียเวลามากกว่าปกติเวลาต้องคิดพวก Helpers เพราะมี guide-line ของมันเอง ซึ่งทำให้มึน ๆ งง ๆ ได้ง่าย ๆ เลย จริง ๆ 9Aum ก็บอกแบบนี้เหมือนกัน ผมก็ว่าจริง ;P

โดยที่ผมเอาออกไป ก็ไปนั่งแกะเจ้า Smarty และ Template-engine ของค่ายอื่น ๆ บ้าง รวมถึง CodeIgniter ด้วย เพื่อเขียนเองซะเลย พบว่าใช้ output-buffer แทนแล้วกัน แต่คาดว่าผมต้อง manage ตัว buffer นี้ด้วย ไม่งั้นมีปัญหาแน่ ๆ ซึ่งจริง ๆ Template-engine ทุกตัวก็ใช้แนวคิดไม่ต่างกันอยู่แล้วครับ คือทำ runtime ให้เสร็จแล้วเอาผลของการทำงานออกมาทีเดียวเลยเพื่อแยกระหว่าง process กับ presentation ออกจากกันอย่างชัดเจน โดยแนวคิดหลัก ๆ เอามาจาก PHPTemplate ของ Drupal ครับ

ต่อมาก็ทำ Acl เสร็จแล้วรวมถึง Authen ด้วย (เพราะทั้งส่วนนี้ต้องทำคู่กันครับไม่งั้น ไม่มีประโยชน์แน่นอน) กำลังปรับแต่งให้ config ง่ายที่สุด และรองรับทั้ง file-base และ db-base ครับ

ส่วน Error Handle และ Logs นั้นเพิ่มและใช้ได้ดี ในระหว่างทำ demo-app และ production-app ครับ (ตอนนี้ผมทำ production-app อยู่ 2-3 ตัวครับผม) โดย Logs จะช่วยได้เยอะมาก ๆ ในเรื่องการ track-error ครับ และ Error Handle มี 2 mode คือ production และ developer ครับ ถ้า environment เป็น production พวก error ต่าง ๆ จะไม่โชว์ออกมาเลย แต่จะ redirect ไปหน้าหลักอย่างเดียว (หรือ control ไปหน้าอื่น ๆ ก็ได้ แต่อันนี้เดี่ยวใส่เพิ่มอีกที)  แต่พวก error พวกนี้จะบันทุกอยู่ใน logs ตลอดครับ ทั้ง 2 mode เลย ทำให้ถ้ามี error ใน production mode จะไม่โดน hack จากการเกิด error ได้ง่ายครับ

ส่วนของ Third Party Components นี่กำลังใส่ทำ Baseclass-Components  อยู่ครับ จะได้สะดวก ๆ หน่อยน่ะครับ ;)

เดี่ยวจะมาเล่าพวกการ config อีกทีครับว่ามีส่วนไหนบ้างครับผม ;)

image