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 ครับ กำลังดูเรื่องคุณสมบัติต่าง ๆ อยู่ครับผม

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

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

l10n และ i18n อาจทำพิษ จนออก Hoffman Framework pre-alpha ช้าลง

ทำ HMF เอง แถมทำข่าวเองเลย ฮา ….

วันนี้นั่ง implement ตัว Form Component และ DateTime Component ของ HMF ซึ่งกำลังไปได้ดี แต่สิ่งที่ผมลืมไปคือเรื่อง l10n และ i18n ไปสนิท เลยไล่ปรับใหม่สำหรับ Form และ DateTime (ผม note ใส่ใน TODO ของ project ไว้แล้ว แต่ไม่ได้สังเกตเลย) ทำให้ไล่หลายส่วนใหญ่ ซึ่งต้องไล่ส่วน Runtime, Configuration-file และ Component ที่เกี่ยวกับ l10n และ i18n ทั้งหมด เพื่อให้มันรองรับได้ตั้งแต่ต้น เหตุผลง่าย ๆ ในการรองรับ l10n และ i18n ตั้งแต่ pre-version เพราะผมอยากให้มันทำงานได้หลายภาษาตั้งแต่ต้นเลย และการมาไล่ปรับทีหลังหลังจากปล่อย pre ไปแล้ว อาจทำให้ app ของนักพัฒนาที่เอา pre-version ไปก่อนอาจมีปัญหาความเข้ากันไม่ได้เมื่อออก version ใหม่ ๆ ออกมา ซึ่งจริง ๆ มันก็มีความเสี่ยงอยู่แล้ว ไม่ว่าจะมี version ใด ๆ ออกมา แต่อยากให้น้อยที่สุดใน pre-version เพราะถือว่าเป็นการออกตัวครั้งแรก อยากให้ประทับใจในหลาย ๆ ส่วน

แต่ก็ยังมีข่าวดีตรงที่ผมทำ content-page แบบ multiple ได้แล้วในตอนนี้ ด้วยเหตุผลที่ว่า ถ้าทำ sigle master/content-page นี่มันดูเฉย ๆ และน่าจะยุ่งยาก ผมเลยนั่งไล่ปรับตัว content-page ของ RenderView ให้รองรับ multiple ของ content-page ได้ตั้งแต่ต้นเลย โดยส่วนของ RenderView หลายส่วน นั้นได้แนวคิดจาก PHPTemplate ของ Drupal มาด้วย โดยเอามาผสมกับ MasterPage ของ ASP.NET ครับ

ส่วนตัว Form Component กะว่าจะทำให้มันคล้าย ๆ กับ Rails (Ruby) แต่ไป ๆ มา ๆ ไม่เอาดีกว่า ทำตามแนวทางเดิม แต่เพิ่มความสะดวกลงไป น่าจะ work กว่า และกะจะ build-in ลงใน Smarty เป็น function นึงที่มา call กับ Form Component แต่ ไป ๆ มา ๆ ไม่เอาดีนั้นแหละ ใช้วิธีสร้าง object ในตัว Controller  แล้วโยนใส่ View ไปเลยง่ายกว่าเยอะ (ไม่เสียเวลาด้วย)

ตอนนี้ไล่ปรับหลายส่วนพยายามให้เท่ากับ version 0.1 ให้ได้ (ตัวนี้ไม่ได้ปล่อยออกมา เพราะใช้ยาก แต่ก็เป็นตัวที่เอาไว้รับงานประทังชีวิตไว้หลายงานเหมือนกัน)