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

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

  1. ทำการ 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 กว่าเดิมมาก ๆ ในตอนนี้
  2. หน้า error handler page นั้น ok แล้ว เพื่อดักข้อผิดพลาดในกรณีไฟล์ของ controller หรือ view ไม่มี รวมถึง arguments ไม่ครบเมื่อ controller ไป handle ตัว action
  3. ตัว config ไฟล์ใน .ini file และสามารถทำ inherit config ได้ด้วย เช่น
    [CODE]
    [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
    [/CODE]
    เมื่อเราเลือก production เป็น environment มันจะไปดึงตัว config มาของ production มา แต่ถ้าใช้  development ก็จะไปดึงส่วนของ development ที่ override ตัว production มาใช้เท่านั้น ทำให้ลดการตั้งค่าลงไปเยอะ

  4. ในส่วนของ Model layer มี 3 ทางเลือกให้ extends มาใช้งานได้ คือ Zend_Db, Doctrine หรือ LogicModel (ตัวนี้ผมเขียนเอง สนับสนุนแค่ MySQL เท่านั้น) โดยใครถนัดแบบไหนก็ใช้แบบนั้นได้เลย เพียงแค่ตั้งค่าใน Model แต่ละตัวว่าจะใช้แบบไหน กำลังหาจุดลงตัวเพื่อให้เราสามารถใช้ Model ได้หลากหลายรูปแบบการ extends จาก 3 ทางเลือก บางครั้ง Model บางตัวอาจจะเหมาะกับ Doctrine มากกว่า 2 ตัวที่เหลืออะไรแบบนั้น และอาจจะรองรับการเขียนด้วย function mysql(i) เดิม ๆ ได้ด้วย โดยผมมองว่า Model นั้นเป็น Business logic ซึ่งควรมี performance สูงที่สุดในการเขียนและนำไปใช้งานครับ
  5. การส่งข้อมูลจาก controller ไปหา view นั้นใช้การ return ของ action ใน controller นั้น โดยการส่งข้อมูลแบบตัวแปรเดียวก็ได้ หรือส่งเป็น array ออกไปก็ได้ โดยส่งเป็น array จะทำการ fetch ข้อมูลให้ชั้นนึงเพื่อส่งผ่านเป็นตัวแปรนึงใน view ให้เลย โดยใช้การ map key เป็นชื่อตัวแปรใน dimension ที่ 1 ของ array ซะ
  6. พยายามเอา ORM หลาย ๆ ตัวมาใช้ร่วมกันใน Model เพื่อลดการยึดติดของระบบกับรูปแบบ ORM ของตัวใดตัวหนึ่ง
  7. ยังคงใช้ 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 ครับ