อัพเดท codeigniter 2.x to 3
ไม่ได้เขียนอะไรซะนาน ช่วงนี้ได้อัพเดทเว็บๆนึงที่ทำไว้สักพักแล้ว แต่ก็ยังไม่ได้ขึ้นซะที(ฮา) จาก Codeigniter(CI) 2.x ไป 3 หลายคนคงสงสัยว่ามันมี v3 ด้วยเหรอ คือ หลังจาก ellislab ประกาศยกเลิกการพัฒนา ก็มี British Columbia Institute of Technology (ฺBCIT) เข้ามาพัฒนาต่อและออก v3 มา แล้วก็เปลี่ยนเว็บใหม่จาก https://ellislab.com/codeigniter มาเป็น http://www.codeigniter.com/ ถ้าใครสนใจลองใช้ก็ดาวน์โหลดจากเว็บไซต์ได้เลย ถ้าอัพเดทก็อ่านวิธีจากนี้เลย จากนี้จะเป็นวิธีการอัพเดทและปัญหาที่เจอมา
- ลบ folder system ออกและเอาของใหม่มาวาง คือตอนแรกวางทับไปเลย ทีนี้การวางทับบนแต่ละ OS มันต่างกันบาง OS ลบอันเก่าและวางอันใหม่ บาง OS มัน merge เข้าด้วยกัน นี่เจอเคส merge นั่งงงอยู่นาน สุดท้ายลบ system เก่าออกแล้วเอา system ใหม่วางจบ
- copy index.php มาวางทับ อันนี้ถ้าใครเพิ่มอะไรลงไปใน index.php ก็คงต้องนั่งไล่ดูเอา
- โฟลเดอร์ config มีการเปลี่ยนแปลงเกือบทุกไฟล์นั่งไล่ดู
- session จากเดิมใช้ cookie ตอนนี้เปลี่ยนมาเป็น $_SESSION แทนทำได้สามารถเรียกได้จาก
$this->session->item
หรือ$_SESSION['item'] หรือ
$this->session->userdata('item'); ก็ได้
- unset userdata เปลี่ยน syntax จาก
$this->session->unset_userdata(array('item' => '', 'item2' => ''));
เป็น
$this->session->unset_userdata(array('item', 'item2')); - CSRF จากเดิมบน v2 เลขเดิมมันสามารถ submit ซ้ำได้ แต่บน v3 ไม่สามารถทำได้แล้ว ทีนี้มันก็มีข้อดี-ข้อเสีย ข้อดีคือไม่สามารถ submit ซ้ำได้ ทีนี้ข้อเสียก็คืออันเดียวกัน บนเว็บนี้จะมี page ที่อัพโหลดรุปภาพผ่าน AJAX ได้หลายๆภาพอยู่ ทีนี้ตอน v2 เวลามัน submit มันก็จะ submit ค่า CSRF ไปด้วย เวลาอัพโหลดหลายๆรูปมันก็จะ submit ไปหลายๆครั้งด้วยค่า CSRF ตัวเดิม แต่พอ v3 วิธีนี้ใช้ไม่ได้แล้ว เราต้องเอาค่า CSRF จาก cookies มาใส่แทนค่าเดิมทุกครั้งที่ AJAX ไป
อัพเดท$config['csrf_regenerate'] = false; ถ้าไม่ต้องการให้ค่าเปลี่ยนทุกรอบกำหนดเป็น false หรือ ถ้าต้องการยกเว้นบาง URI ก็ใส่ลงในนี้เลย
$config['csrf_exclude_uris']=array('uri1', 'uri2');
- CI_DB_result จากเดิมใช้
$rs->num_rows
เปลี่ยนเป็น
$rs->num_rows() - form_validation มีการเอา xss_clean rule ออกไป
- ใน config/route.php ค่า default controller จากเดิมเราสามารถกำหนดเป็น controllers ใน sub directory ได้ แต่ v3 ทำไม่ได้ อันนี้ไปเปิด issue บน github โดนตอบมาว่า yep คำเดียวแล้วปิด issue เลย เพราะงั้นทางแก้คือ move controller ที่จะใช้ ออกมาข้างนอก หรือ extends CI_Router แล้ว ovveride method _set_default_controller โดยเพิ่ม $this->_set_request(ค่า) ลงไปตัวอย่างดูได้จากไฟล์เดียวกันใน v2
- ชื่อไฟล์จากเดิมเป็นตัวเล็กหมด เปลี่ยนมาเป็น capitalize
- move application/errors ไปไว้ใน application/views/errors
- อันนี้ยังไม่แน่ใจยังไม่ได้ไล่ดูจริงๆจังๆเท่าไหร่ คือจากเดิม
$array = $this->input->post('arrayItem', true) จากเดิมจะ return ออกมาปกติ แต่อันใหม่มันกลายเป็น null ต้องเอา true ออกถึงจะใช้ได้ - วิธีการ xss filter ที่ input ใน v3 เค้าแนะนำว่าไม่ควรใช้ เพราะ xss ควรใช้ตอน output แทนจะดีกว่า
ทีนี้หลังจากอัพแล้วเป็นไง ก็รู้สึกไม่ได้ต่างอะไรจากเดิมมาก ตัว core ยังไม่ได้เขียนเป็น package เหมือนเดิม ความเร็วก็น่าจะประมาณเดิม คือเว็บนี้มันไม่ได้มี feature หวือหวาอะไรด้วยไง เลยวัดอะไรไม่ได้ นอกเหนือจากนี้มีเปลี่ยนแปลงตรงไหนบ้างก็เข้าไปอ่านใน doc เอาแล้วกัน
git repo