CakePHP เป็นเฟรมเวิร์ก PHP ที่น่าทึ่ง แต่มันมีช่วงการเรียนรู้ที่สูงชัน! ต้องใช้การวิจัยและการฝึกอบรมที่ดีเพื่อที่จะเป็นผู้เชี่ยวชาญ
ฉันโชคดีที่ใช้ CakePHP มานานกว่า 7 ปีแล้วและในช่วงเวลานั้นฉันได้รับเกียรติจากการทำงานกับหลาย ๆ สมาชิกของชุมชน CakePHP .
ในบทช่วยสอน CakePHP นี้ฉันต้องการอธิบายแนวทางปฏิบัติที่ไม่ดีบางประการที่ฉันได้เห็นในช่วงหลายปีที่ผ่านมาและเสนอแนวทางที่ถูกต้องเพื่อหลีกเลี่ยงข้อผิดพลาดเหล่านี้ นี่ไม่ได้หมายความว่าโค้ดของฉันสมบูรณ์แบบ แต่ในฐานะโปรแกรมเมอร์เราเรียนรู้อยู่เสมอดังนั้นจึงเป็นเรื่องสำคัญที่จะต้องปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดและปรับเปลี่ยนเมื่อคุณเรียนรู้!
เนื้อหาของบทความนี้ได้รับแรงบันดาลใจจากโพสต์จาก CakeCoded . หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ CakePHP โปรดไปที่ส่วนการเรียนรู้ของเรา ที่นี่ .
รูปแบบการเข้ารหัส CakePHP สามารถเป็นได้ ดูที่นี่ . ฉันจะเน้นบางสิ่งที่ฉันมักจะสังเกตเห็นเมื่อดูโค้ดของโปรแกรมเมอร์คนอื่น ๆ
โครงสร้างการควบคุม บ่อยครั้งที่คุณเห็นโปรแกรมเมอร์ทำสิ่งนี้ผิดและในบางกรณีก็นำแนวทางปฏิบัติจากภาษาเขียนโค้ดอื่น ๆ CakePHP ต้องการไวยากรณ์ต่อไปนี้:
if ((expr_1) || (expr_2)) { // action_1; } elseif (!(expr_3) && (expr_4)) { // action_2; } else { // default_action; }
ควรมีช่องว่าง 1 (หนึ่ง) ก่อนวงเล็บแรกและ 1 (หนึ่ง) ช่องว่างระหว่างวงเล็บสุดท้ายและวงเล็บเปิด ดังนั้นหมายความว่าสิ่งต่อไปนี้ไม่ถูกต้อง:
if($this->request->data){ }
สังเกตระยะห่างระหว่าง if
และ (
และระหว่าง )
และ {
ใช้วงเล็บปีกกาในโครงสร้างควบคุมเสมอแม้ว่าจะไม่จำเป็นก็ตาม ช่วยเพิ่มความสามารถในการอ่านโค้ดและทำให้คุณมีข้อผิดพลาดทางตรรกะน้อยลง
ตัวอย่างเช่นสิ่งต่อไปนี้ไม่ถูกต้อง:
if ($foo) $bar = true
ควรมีรูปแบบดังนี้:
if ($foo) { $bar = true }
สุดท้ายดูตำแหน่งที่คุณวางวงเล็บไว้ การเปิดวงเล็บไม่ควรขึ้นบรรทัดใหม่ และตรวจสอบให้แน่ใจว่าวงเล็บทั้งหมดของคุณอยู่ในแนวเดียวกันเพื่อให้วงเล็บใหม่แต่ละอันอยู่ในแนวเดียวกันกับวงเล็บปิด
ตัวอย่างที่ไม่ถูกต้องมีดังนี้
if ($foo) { $bar = true; }
สิ่งนี้ไม่ถูกต้องวงเล็บเปิดควรอยู่ในบรรทัดแรก:
if ($foo) { $bar = true; if ($action) { $to = false; } }
การเยื้องต้องจัดเรียงให้ถูกต้อง
ฉันมักจะได้ยินโปรแกรมเมอร์พูดว่า“ แต่ฉันยุ่งเกินกว่าจะเขียนโค้ดให้เรียบร้อย….” คำตอบของฉันคือ“ เชื่อฉันเถอะรหัสที่เรียบร้อยจะยืนหยัดการทดสอบของเวลา” การเขียนโค้ด CakePHP ซึ่งไม่สามารถอ่านได้จะเป็นฝันร้ายที่จะกลับมาหากคุณต้องการเปลี่ยนแปลงในอีกไม่กี่เดือน
ฉันโชคดีเมื่อเร็ว ๆ นี้ที่ได้พูดคุยอย่างไม่เป็นทางการกับผู้พัฒนาฐานข้อมูลจาก Facebook เราเริ่มพูดคุยเกี่ยวกับ CakePHP และเขาก็พูดกับฉันว่า 'โอ้นั่นใช้ ORM ไม่ใช่เหรอ นั่นอาจเป็นเรื่องน่ากลัว” ฉันถามเขาว่าเขาหมายถึงอะไรและเขาแสดงความคิดเห็นว่าด้วย Object-relational mapping (ORM) มันเป็นเรื่องง่ายสำหรับการสืบค้น SQL ที่มีขนาดใหญ่โดยไม่จำเป็น
เขาถูกต้องในทาง ความมหัศจรรย์ส่วนหนึ่งของ CakePHP อยู่ที่การใช้ ORM และวิธีการจัดกลุ่มความสัมพันธ์ของตารางฐานข้อมูลต่างๆเข้าด้วยกัน โดยค่าเริ่มต้น CakePHP จะเลือกข้อมูล 'Belongs To', 'Has One' และ 'Has Many' ที่เกี่ยวข้องโดยอัตโนมัติและอาจนำไปสู่การสืบค้น SQL ที่มีขนาดใหญ่มาก คำค้นหาเหล่านี้อาจไม่น่ากังวลเมื่อคุณกำลังพัฒนาแอปพลิเคชันในตอนแรก แต่หลังจากรวบรวมข้อมูลจริงเป็นเวลา 6 เดือนคุณอาจพบว่าแอปพลิเคชันทำงานช้ามากและในบางกรณีอาจขัดข้องหากไม่ได้รับการปรับปรุงให้เหมาะสม
ฉันมองหาสองสิ่งเมื่อตรวจสอบเว็บไซต์ที่มีอยู่ ประการแรกระดับการเรียกซ้ำเริ่มต้นมีการเปลี่ยนแปลงหรือไม่? โดยค่าเริ่มต้น CakePHP จะตั้งค่าระดับการเรียกซ้ำเป็น 1 ซึ่งในความคิดของฉันสูงเกินไป ฉันมักจะตั้งค่าเป็น -1 จากนั้นใช้พฤติกรรมที่สามารถควบคุมได้เพื่อรับโมเดลที่เกี่ยวข้อง
นั่นนำไปสู่สิ่งที่สองที่ฉันมองหา - มีการใช้พฤติกรรมคอนเทนเนอร์หรือไม่? ฉันมักจะมีลูกค้าใหม่มาหาฉันและบอกว่า CakePHP ทำงานช้า สาเหตุเกือบตลอดเวลาเพราะไม่ได้ใช้งาน Containable! โปรแกรมเมอร์ CakePHP ที่ดีจะปรับการสืบค้น SQL ให้เหมาะสมไม่ว่าจะทำงานเบื้องหลัง 'มายากลอัตโนมัติ' มากแค่ไหนก็ตาม
ไม่ได้เพิ่มพฤติกรรมที่สามารถควบคุมได้จนกว่า CakePHP 1.2 แต่เด็กชายได้สร้างความแตกต่างหรือไม่! อย่าลืมใช้ containable ให้ได้มากที่สุดเนื่องจากเป็นวิธีที่มีประสิทธิภาพในการปรับแต่ง SQL ของคุณให้เหมาะสม สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีปรับใช้และใช้พฤติกรรมคอนเทนเนอร์ คลิกที่นี่ .
โค้ด CakePHP ที่ดีจะมีตรรกะในไฟล์โมเดล วิธีนี้ใช้เวลาในการทำความคุ้นเคย แต่เมื่อเชี่ยวชาญแล้วจะไม่มีการมองย้อนกลับไป! ควรใช้ไฟล์คอนโทรลเลอร์สำหรับสิ่งที่มีไว้สำหรับรูปแบบ MVC - การควบคุม! ดังนั้นใช้ไฟล์คอนโทรลเลอร์ของคุณเพื่อจัดการการกระทำของผู้ใช้ในขณะที่ปล่อยให้ตรรกะทางธุรกิจไปอยู่ในไฟล์โมเดล
ตัวอย่างที่ดีของเรื่องนี้คือ CRUD ธรรมดา ๆ ซึ่งเป็นการกระทำในชีวิตประจำวัน! ลองใช้ฟังก์ชันเพิ่มโพสต์จากบทช่วยสอนของบล็อกเป็นตัวอย่าง ฟังก์ชันเพิ่มเริ่มต้นมีดังนี้:
public function add() { if ($this->request->is('post')) { $this->Post->create(); if ($this->Post->save($this->request->data)) { $this->Session->setFlash(__('Your post has been saved.')); return $this->redirect(array('action' => 'index')); } $this->Session->setFlash(__('Unable to add your post.')); } }
การดำเนินการของคอนโทรลเลอร์นี้ใช้ได้ดีสำหรับการเพิ่มแบบธรรมดา แต่จะเกิดอะไรขึ้นหากคุณต้องการทำสิ่งต่างๆเช่นส่งอีเมลไปยังผู้ดูแลระบบเมื่อมีการเพิ่มโพสต์หรืออัปเดตการเชื่อมโยงโมเดลอื่นเมื่อมีการเพิ่มโพสต์ นี่เป็นตรรกะเพิ่มเติม แต่ตรรกะนี้ไม่ควรเข้าไปในไฟล์คอนโทรลเลอร์ของเรา
แต่เราจะเขียนฟังก์ชันสำหรับสิ่งนี้ใน Post.php
ของเรา แบบ. อาจจะเป็นเช่นนี้:
public function addPost($data = array(), $emailAdmin = true) { $this->create(); $this->save($data); // update any other tables // send the email to the admin user if ($emailAdmin) { } // if all is successful return true; }
จากนั้นจะส่งผลให้เกิดการเปลี่ยนแปลงเล็กน้อยในการกระทำของคอนโทรลเลอร์ดังนี้:
public function add() { if ($this->request->is('post')) { if ($this->Post->addPost($this->request->data)) { $this->Session->setFlash(__('Your post has been saved.')); return $this->redirect(array('action' => 'index')); } $this->Session->setFlash(__('Unable to add your post.')); } }
อย่างที่คุณเห็นการกระทำใหม่เป็นบรรทัดน้อยลงหนึ่งบรรทัดเนื่องจาก $this->Post->create()
ถูกย้ายไปยังไฟล์โมเดล
นี่เป็นตัวอย่างที่สมบูรณ์แบบในชีวิตประจำวันว่าการย้ายลอจิกไปยังไฟล์โมเดลเป็นความคิดที่ดี - และแน่นอนว่ามันทำให้ฐานรหัสที่สะอาดยิ่งขึ้น!
นี่เป็นข้อถกเถียงที่เกิดขึ้นอยู่เสมอ แต่การกลับมาบ่อยครั้งและการกลับมาก่อนเวลาทำให้โค้ดดูสะอาดขึ้นมาก สิ่งนี้ใช้กับวิธีการแบบจำลองมากกว่าสิ่งอื่นใด
แต่ฉันหมายถึงอะไรกันแน่? เรามาดูวิธีการที่เราเพิ่มไว้ในบทช่วยสอน CakePHP ด้านบน:
public function addPost($data = array(), $emailAdmin = true) { $this->create(); $this->save($data); // update any other tables // send the email to the admin user if ($emailAdmin) { } // if all is successful return true; }
หากต้องการกลับบ่อยและกลับก่อนเวลาหมายความว่าเมื่อเราดำเนินการตามฟังก์ชันของเราเราตรวจสอบเพื่อให้แน่ใจว่าทุกอย่างเรียบร้อยเป็นประจำ หากไม่เป็นเช่นนั้นเราจะส่งคืนเท็จหรือส่งคืนข้อผิดพลาด CakePHP
อาจจะง่ายที่สุดที่จะแสดงสิ่งนี้พร้อมกับตัวอย่าง ฟังก์ชันข้างต้นสามารถเขียนได้สองวิธี:
public function addPost($data = array(), $emailAdmin = true) { if ($data) { $this->create(); $result = $this->save($data); if ($result) { // update any other tables // send the email to the admin user if ($emailAdmin) { // send the admin email } } else { // problem saving the data return false; } // if all is successful return true; } else { // no data submitted return false; } }
ดูว่าโค้ดไม่สามารถอ่านได้อย่างรวดเร็วได้อย่างไร? มี if
s และ else
s อยู่ทั่วทุกที่และฟังก์ชันจะกลายเป็นการเยื้องขนาดใหญ่ครั้งเดียวอย่างรวดเร็ว อย่าเข้าใจฉันผิดฉันชอบการเยื้องที่สะอาด แต่ดูว่าฟังก์ชั่นมีลักษณะอย่างไรถ้ามันเขียนด้วยการส่งคืนบ่อยๆกลับหลักการก่อน
public function addPost($data = array(), $emailAdmin = true) { if (!$data) { // no data submitted return false; } $this->create(); $result = $this->save($data); if (!$result) { // problem saving the data return false; } // update any other tables // send the email to the admin user if ($emailAdmin) { // send the admin email } // if all is successful return true; }
ในตัวอย่างเล็ก ๆ นี้คุณจะเห็นโค้ดมีการเยื้องเพียงครั้งเดียวและอ่านได้ง่ายกว่ามาก ตรรกะมีเหตุผลมากกว่านั้นให้ตรรกะทำงานทีละบรรทัดและหากมีปัญหาระหว่างทางให้ส่งคืนข้อผิดพลาดและอย่าดำเนินการต่อในบรรทัดถัดไป
สิ่งนี้ช่วยให้โปรแกรมเมอร์ CakePHP สามารถเขียนแบบเดียวกับที่เราอ่าน - อ่านโค้ดจากซ้ายไปขวาบนลงล่างแทนที่จะอยู่ในบล็อกต่างๆซึ่งอาจทำให้สับสนได้อย่างรวดเร็ว!
DRY ย่อมาจาก Don’t Repeat Yourself และเป็นปรัชญาที่ควรปฏิบัติตามเมื่อเขียนโค้ดใน CakePHP ด้วยรหัสเชิงวัตถุไม่มีข้อแก้ตัวสำหรับการทำซ้ำบล็อกรหัสเดียวกันสองครั้ง!
ต่อไปนี้คือเคล็ดลับบางประการของ CakePHP เพื่อให้แน่ใจว่าคุณจะไม่ทำซ้ำ:
ดังที่ได้กล่าวมาแล้วตั้งเป้าหมายที่จะใส่ตรรกะในไฟล์โมเดลเพื่อให้คุณสามารถแบ่งปันตรรกะได้
ในไฟล์มุมมองของคุณหากคุณกำลังดูมุมมองซ้ำให้สร้างรหัสมุมมองเป็นองค์ประกอบหรือแม้แต่ตัวช่วยที่กำหนดเอง
ตั้งค่าการกำหนดค่าบางอย่าง - app/Config/bootstrap.php
ไฟล์เป็นสถานที่ที่ยอดเยี่ยมสำหรับสิ่งนี้ วิธีนี้ช่วยให้แน่ใจว่าคุณไม่ได้เขียนโค้ดยาก ๆ เช่นชื่อแอปพลิเคชันและที่อยู่อีเมลหลัก สิ่งสุดท้ายที่คุณต้องทำคือดูไฟล์หลายร้อยไฟล์เพียงเพราะลูกค้าขอให้อัปเดตที่อยู่อีเมลในแอปพลิเคชัน
ถามตัวเองเสมอว่า“ ถ้าฉันเขียนโค้ดซ้ำจะมีวิธีที่ดีกว่านี้ไหมในการเขียนโค้ดนี้และฉันวางรหัสนี้ถูกที่หรือไม่” มีโอกาสที่ถ้าคุณต้องทำรหัสซ้ำก็สามารถเขียนได้ดีกว่า
ประเด็นสุดท้ายที่ฉันจะทำคือเกี่ยวกับความคิดเห็น ประการแรกการบล็อกเอกสาร doc block คือเมื่อคุณบันทึกวิธีการหรือการดำเนินการ ใช้เวลาเพียงหนึ่งนาทีในการบันทึกเล็กน้อยเกี่ยวกับสิ่งที่ฟังก์ชันกำลังทำอยู่ แต่มันสร้างความแตกต่างในแง่ของความสามารถในการอ่านโค้ด
CakePHP Doc Blocks ต้องชิดขอบซ้ายของหน้า ดังนั้นตัวอย่างง่ายๆโดยใช้รหัสจากด้านบน
/** * Adds & saves a post as well as emails the admin to let them know the post has been added. * Also performs some saving to another table * * @param array $data The post data * @param bool $emailAdmin If set to true, will email the website admin * @return bool Returns true if successful */ public function addPost($data = array(), $emailAdmin = true) {
ดังที่คุณจะเห็นการเขียนบล็อกเอกสารใช้เวลาไม่นาน แต่สร้างความแตกต่างอย่างมากในแง่ของอายุการใช้งานของโค้ด ท้ายที่สุดก็หมายความว่าโค้ดสามารถอยู่ได้ในอดีตที่คุณเป็นนักพัฒนาซอฟต์แวร์
เช่นเดียวกันกับความคิดเห็นในบรรทัด อย่ากลัวที่จะอธิบายว่าโค้ดของคุณใช้ทำอะไรและทำไม! ช่วยให้เข้าใจโค้ดของคุณได้ง่ายขึ้นในระยะยาวโดยเฉพาะอย่างยิ่งหากนักพัฒนารายอื่นกำลังดูโค้ดอยู่!
CakePHP เป็นเฟรมเวิร์กที่ครอบคลุมและมีคุณสมบัติครบถ้วน เนื่องจากเป็นไปตามแบบแผนเกี่ยวกับการกำหนดค่า CakePHP จึงเข้มงวดกว่าเฟรมเวิร์กที่ใช้ PHP อื่น ๆ ในแง่ที่ผู้ใช้ 'บังคับ' ให้ทำตามวิธีการบางอย่างในการวางโค้ด สิ่งนี้อาจเป็นที่ถกเถียงกัน แต่จากประสบการณ์ของฉันมันนำไปสู่ฐานรหัสที่มีความสอดคล้องอ่านได้และเข้าใจได้มากกว่า - แทนที่จะปล่อยให้นักพัฒนา 'เลือก' ว่าควรเขียนโค้ดอย่างไรทีมพัฒนาจะเขียนโค้ดที่สอดคล้องกันโดยทำตามอนุสัญญาของ Cake .
ด้วยการทำตามบทช่วยสอน CakePHP นี้และตรวจสอบให้แน่ใจว่าโค้ดของคุณเขียนได้ดีแอปพลิเคชั่นสามารถยืนหยัดอยู่ได้ ควรเขียนโค้ดสำหรับวันพรุ่งนี้เสมอ - เพื่อที่ว่าหากนักพัฒนารายอื่นกำลังมองหาบล็อกโค้ดเฉพาะในอีกหลายปีต่อมาเขาจะเข้าใจโค้ดและยึดตามมาตรฐานที่คาดไว้ CakePHP ก็ไม่ต่างกันและหวังว่าคู่มือนี้จะช่วยแก้ไขนิสัยที่ไม่ดีบางอย่างได้