Archive for the ‘symfony’ Category

จาก Data Model สู่ระบบทั้งระบบ

แหม่ช่วงก่อนกินข้าวพักนึงเนี่ย เขียนสักหน่อย หุหุ (ชอบมาเขียนตอนก่อนกินข้าว ก็หิวดิ) content นี้เป็นเรื่อง “จาก model สู่ระบบทั้งระบบ” ซึ่งหลายๆ คนก็งงนะ ว่า model คืออะไร เป็นแบบนี้หรือเปล่า

555 ม่ายช่าย model แบบนี้นะครับ โอ้ยๆ ไม่ใมวดูแล้วหื่น เข้าเรื่องดีกว่า

Model ที่เรียกๆกันติดปากนี่ก็คือ Data Model ครับ

Data Model คือส่วนหนึ่งของการ Analyst จาก Requirement ครับ ในแง่การพัฒนาระบบแล้ว Data Model มีความสำคัญมากทีเดียว เพราะมันก็คือ รูปแบบในการจัดเก็บข้อมูลต่างๆ ของระบบนั้นๆเลย

ให้คิดว่า ถ้าคุณจัดเก็บข้อมูลผิดรูปแบบก็เท่ากับว่า คุณมั่วไปแล้ว ถ้าเขียน code มั่วอีก โอ้ว พระเจ้า ห่าอะไรของมันวะเนี่ย

ในการพัฒนา Data Model จะได้ออกมาช่วงหลังๆ ของการ Analyst เพราะกลั่นกรอง Requirement เสร็จแล้วถึงจะได้ แต่ละที่ ถ้า Requirement ต่างกัน Model ก็จะต่างกัน

Requirement เดียวกัน โครงสร้างของ Data Model อาจจะต่างกันก็ได้ไม่มีใครผิดขึ้นอยู่กับการ Analyst

อ่านเะพิ่มเติมเกี่ยวกับ Data Model ได้ที่นี่

เมื่อเราได้ Data Model แล้ว เราก็เอาไป Map ด้วย ORM เราก็เขียนระบบได้แล้วสบาย

สรุปๆ

  1. ได้ Requirement
  2. เอาไป Analysis
  3. ได้ Data Model และ Logic ต่าง
  4. เอา Data Model ไป ORM
  5. เอา ORM ไปเขียน Code ตาม Business Logic ที่คิดไว้

อันนี้สรุปๆนะไม่ได้ตรงเป๊ะๆ และระบบที่ใหญ่มากๆ ก็เกิดขั้นตอนที่มากกว่านี้ ถ้าเขียนอะไรเล่นเล็กๆ ก็สบาย คิดเองทำเอง แก้เอง ใช้เอง สู้ๆ

Doctrine

ไม่ต้องเกรินอะไรมากเพราะเขียนก่อนกินข้าว เขียนแบบ หิวนิดๆ อิอิ ขอยก about doctrine มาเลยแล้วกัน

Doctrine is a PHP ORM (object relational mapper) for PHP 5.2.3+ that sits on top of a powerful PHP DBAL (database abstraction layer). One of its key features is the ability to optionally write database queries in an OO (object oriented) SQL-dialect called DQL inspired by Hibernates HQL. This provides developers with a powerful alternative to SQL that maintains a maximum of flexibility without requiring needless code duplication.

จาก http://www.doctrine-project.org/about

พูดง่ายๆ นะมันก็คือ ORM ตัวหนึ่งนั้นเอง ซึ่งอยู่ในรูปแบบของภาษา PHP ครับ ใครไม่รู้ว่า ORM คืออะไร กลับไปอ่าน OR Mapping เบื้องต้น ได้ เพราะถ้ายังงง ก็จะ งงต่อ 55

ซึ่งตอนที่ผมเขียนนี้ Doctrine นั้นมีถึง Version 1.2 แล้วถูกนำไปใช้งานได้กับหลาย framework เลยทีเดียว ที่เห็นดังก็ Zend, Symfony อื่นไม่ค่อยได้เข้าไปดูน่ะ ว่าแล้วก็เข้าไป download doctrine กันได้เลยครับ open source เปิดกว้างท่านอยู่แล้ว

OR Mapping (แบบฉบับ wiki eng)

ขอคัดลอกมา แปล แล้ว อธิบายย่อๆ นะครับ เพราะมันคือหลักการเฉยๆ เอาให้รู้ว่ามันคืออะไร จะได้ใช้ framework ได้ work จริงๆ ไม่อย่างนั้นคุณก็จะใช้ framework แบบ ไม่ work เลยซะทีเดียว

Object-relational mapping (ORM, ORM, and ORM) in computer software is a programming technique for converting data between incompatible type systems in relational databases and object-oriented programming languages. This creates, in effect, a “virtual object database” that can be used from within the programming language. There are both free and commercial packages available that perform object-relational mapping, although some programmers opt to create their own ORM tools.

ถ้าใครอ่าน Eng ก็ไม่ต้องอ่านข้างล่างนี้ ครับ

ความหมายของ OR Mapping หรือที่เรียกเต็มๆ ว่า Object-relational mapping โดยมันมีตัวย่อหลายแบบ เพราะคนที่ใช้มัน ขี้เกียจต่างๆ กันเลยเขียนได้หลายแบบ คือ ORM, O/RM หรือ ที่เราเขียนไปเป็นหัวข้อ OR Mapping

ตามที่ wiki บอกมันคือเทคนิคนะครับ(ไม่ใช้หลักการอะไรที่จะบังคับ) ในการ convert ข้อมูลระหว่าง ข้อมูลที่อยู่ใน relational database (ไอ้ที่เราเรียก Database จนติดปากในปัจจุบัน) กับ Object oriented programming language (ภาษาที่เราใชเงานเขียนโปรแกรม)

โดยเราจะคิดว่า object ที่เราใช้งานอยู่คือข้อมูลที่อยู่ใน database แล้วเรียกหรือใช้งานมันเลย โดยข้ามอะไร หรือ ข้อแม้อะไรต่างๆ ให้ object พวกนั้นทำงานไปหมดเลยไม่ต้องไปสนใจมัน ผ่าน OR Mapping Tools

แปลคร่าวๆ ไปแล้วมาดูจริงๆกัน เช่นเราทำ database 2 field คือ id และ name เราก็จะแนวคิดว่า object นั้นมี 2 attribute คือ id และ name

ข้อมูลหลายๆ record ก็คือ array ของ object

เป็นไงง่ายมะ หุหุ ฟังดูมันก็เหมือนกับจะง่ายแหละนะ ไม่ต้องคิดอะไรมาก เพราะเราเองไม่ได้เขียน OR Mapping Tools เอง ก็สบาย

ข้อมูลที่เขียน แปลมาจาก http://en.wikipedia.org/wiki/Object-relational_mapping ซึ่งถูกปัดฝุ่นแล้วชื่อได้ แต่คำพูดที่ผมแปล ยังไม่ได้ปัดฝุ่นนะ มันยังมัวอยู่อย่าเอาไปใช้ สุมสี่สุ่ม 5 เพราะรายละเอียดความจริงแล้วมันเยอะจนอ่านไปหลายวันได้เลยกว่าจะเข้าใจ แต่ OR Mapping ถูกใช้งานใน อุตสาหกรรม การผลิต software มาก ทำให้ถ้าเข้าใจแล้วจะทำอะไรต่อไปได้เยอะครับ

override form of symfony model

อันนี้จดไว้กันเหนียวเฉยๆ นะเพราะปกติก็คงรู้ๆ กันอยู่แล้ว แค่ว่า มันนึกยาก ช่วงหลังๆ เหมือนจะแก่ๆ ยังไงไม่รู้ หลงๆ ลืมๆ

การ ที่ symfony generate form ให้เรานั้น จะมี baseXXXXForm ออกมา แล้วก็ XXXXFrom ออกมา XXX ก็หมายถึง model นั่นเอง ทีนี้ถ้สเราไปแก้ base Form เวลาที่เราแก้ model ไปแล้ว propel:build-form ใหม่ base มันจะ generate ใหม่ เพราะฉนั้น อย่าโง่ไปเปลี่ยน หรือ แก้ไขใน base Form นะครับ (เค้าทำออกมาให้อย่างดีอย่าทะลึ่ง)

ให้ไปทำ ที่ XXXForm นะครับ

การ override form ตอนสร้าง from เพื่อแสดงนั้น ให้เขียนลงใน function configure ใน XXXForm นะครับเช่น

จาก class BaseContentForm extends BaseFormPropel มี field

‘published’       => new sfWidgetFormDate(),
‘publish_date’    => new sfWidgetFormDate(),

เราก็ทำเป็น field ของเรา หรือ plugin ไงแบบนี้

class ContentForm extends BaseContentForm
{
public function configure()
{
$this->widgetSchema['published'] = new sfWidgetFormDateJQueryUI();
$this->widgetSchema['publish_date'] = new sfWidgetFormDateJQueryUI();
}
}

เป็นต้นนะ เราก็จะได้ตามที่เราต้องการโดยที่ไมต้องไปเปลี่ยนไง build-model เปลี่ยนตามสบายเลย

symfony redirect กลับไปหน้าที่แล้ว

การ redirect ใน action กลับไปที่หน้าเดิม เช่นหลังจาก login ให้เขียนว่า

$this->redirect($request->getReferer());