สมมติว่าคุณต้องการสร้างโปรเจ็กต์ที่มีโหลดสูงโดยใช้เฟรมเวิร์ก PHP MVC คุณอาจใช้การแคชทุกที่ที่เป็นไปได้ บางทีคุณอาจจะสร้างโปรเจ็กต์ในไฟล์เดียวหรืออาจจะเขียนเฟรมเวิร์ก MVC ของคุณเองด้วยฟังก์ชันที่น้อยที่สุดหรือเขียนบางส่วนของเฟรมเวิร์กอื่นใหม่ ในขณะที่ใช่มันได้ผล แต่มันค่อนข้างยุ่งยากใช่ไหม โชคดีที่มีอีกวิธีหนึ่งที่ทำให้การปรับแต่งเหล่านี้ส่วนใหญ่ไม่จำเป็น (อาจบันทึกสำหรับแคช) และโซลูชันนี้เรียกว่าเฟรมเวิร์ก PhalconPHP
PhalconPHP เป็นเฟรมเวิร์ก MVC สำหรับ PHP ที่เขียนด้วยภาษา C และจัดให้เป็นส่วนขยาย PHP ที่คอมไพล์แล้ว นี่คือสิ่งที่ทำให้เป็นหนึ่งในเฟรมเวิร์กที่เร็วที่สุดที่พร้อมใช้งาน (พูดตามตรงอย่างสมบูรณ์สิ่งที่เร็วที่สุดคือ Yaf แต่เป็นเฟรมเวิร์กขนาดเล็กและมีฟังก์ชันการทำงานที่ จำกัด กว่า Phalcon มาก) PhalconPHP ไม่ต้องการการดำเนินการใด ๆ กับไฟล์ PHP ที่ยาวนานและไม่จำเป็นต้องตีความตามคำขอทุกครั้ง - โหลดลงใน RAM หนึ่งครั้งเมื่อเว็บเซิร์ฟเวอร์ของคุณเริ่มทำงานและใช้ทรัพยากรน้อยมาก
เฟรมเวิร์ก MVC ถือเป็นแนวทางปฏิบัติที่ดีที่สุดในการพัฒนาเว็บมาเป็นเวลานานโดยปัจจุบันเป็นมาตรฐานระดับมืออาชีพดังนั้นนักพัฒนาเว็บส่วนใหญ่จึงคุ้นเคยกับเฟรมเวิร์ก MVC อย่างน้อยหนึ่งเฟรมสำหรับ PHP: Symfony, Yii, Laravel, CodeIgniter, Zend Framework ฯลฯ แต่ละอย่างมีข้อดีและข้อเสียของตัวเอง แต่สิ่งที่เหมือนกันทั้งหมด? ทั้งหมดนี้เขียนด้วย PHP และประกอบด้วยไฟล์ PHP จำนวนมากที่มีตรรกะจำนวนมากที่ล่ามต้องเรียกใช้ในทุกคำขอทุกครั้งที่โค้ดของคุณทำงาน แม้ว่าสิ่งนี้จะทำให้เกิดความโปร่งใสอย่างมาก แต่เราก็จ่ายด้วยประสิทธิภาพ โค้ดจำนวนมากและไฟล์ที่รวมไว้จำนวนมากต้องใช้หน่วยความจำและเวลาอย่างมากโดยเฉพาะใน PHP (เนื่องจากมีการตีความไม่ใช่คอมไพล์) ใช่สถานการณ์ดีขึ้นมากใน PHP 7 แต่ยังมีสิ่งที่ต้องปรับปรุงอีกมากและ PhalconPHP นำการปรับปรุงเหล่านั้นมาสู่ตาราง
มาดูเกณฑ์มาตรฐานกัน
เกณฑ์มาตรฐานอย่างเป็นทางการ อายุห้าขวบ - แก่เกินไปที่จะใช้ได้ในตอนนี้ แต่ถึงอย่างนั้นคุณก็สามารถเห็นความแตกต่างของ PhalconPHP ได้อย่างมาก มาดูสิ่งใหม่ ๆ กันดีกว่า ใน การเปรียบเทียบปี 2559 Phalcon ติดอันดับหนึ่งในห้าซึ่งเป็นผู้นำที่ชัดเจนในบรรดาเฟรมเวิร์คระดับมืออาชีพและยอมรับเฉพาะ PHP ดิบและไมโครเฟรมเวิร์กบางส่วนเท่านั้น
ดังนั้น Phalcon เร็ว Raw PHP นั้นรวดเร็วเช่นกัน แต่เราต้องการสิ่งอำนวยความสะดวกทั้งหมดที่เฟรมเวิร์ก MVC มีให้และ Phalcon ก็รับมือกับความท้าทายรวมถึงส่วนประกอบต่างๆเช่น:
นั่นเป็นเพียงชื่อไม่กี่ ในการตัดเรื่องสั้นให้สั้น PhalconPHP มีทุกสิ่งที่คุณต้องการเพื่อสร้างแอปพลิเคชันสำหรับองค์กรขนาดใหญ่เช่น RESTful ไฟ สำหรับระบบโหลดสูง
สิ่งที่ดีอีกอย่างเกี่ยวกับ Phalcon คือรูปแบบเล็ก ๆ - เพียงแค่เปรียบเทียบ Phalcon ORM กับหลักคำสอน 2 อย่างมหาศาล
มาดูการสร้างโครงการ PhalconPHP
โดยทั่วไปเฟรมเวิร์ก MVC มีสองประเภท: เฟรมเวิร์กแบบสแต็กเต็มรูปแบบ (เช่น Symfony, Yii) และไมโครเฟรมเวิร์ก (เช่น Lumen, Slim, Silex)
เฟรมเวิร์กแบบเต็มสแต็กเป็นตัวเลือกที่ดีสำหรับโปรเจ็กต์ขนาดใหญ่เนื่องจากมีฟังก์ชันการทำงานที่มากขึ้น แต่พวกเขาต้องการคุณสมบัติและเวลาในการรันมากกว่าเล็กน้อย
ไมโครเฟรมเวิร์กช่วยให้คุณสร้างต้นแบบที่มีน้ำหนักเบาได้อย่างรวดเร็ว แต่มันไม่มีฟังก์ชันการทำงานดังนั้นโดยทั่วไปแล้วคุณควรหลีกเลี่ยงการใช้มันสำหรับโครงการขนาดใหญ่ อย่างไรก็ตามข้อดีอย่างหนึ่งของไมโครเฟรมเวิร์กคือประสิทธิภาพ โดยปกติแล้วจะเร็วกว่าสแต็กแบบเต็มมาก (ตัวอย่างเช่นเฟรมเวิร์ก Yaf มีประสิทธิภาพต่ำกว่า PHP ดิบเท่านั้น)
PhalconPHP รองรับทั้งสองอย่าง: คุณสามารถสร้าง full-stack หรือ micro application ยิ่งไปกว่านั้นเมื่อคุณพัฒนาโปรเจ็กต์ของคุณใน PhalconPHP เป็นแอปพลิเคชันขนาดเล็กคุณยังสามารถเข้าถึงคุณสมบัติที่มีประสิทธิภาพส่วนใหญ่ของ Phalcon ได้และประสิทธิภาพของมันก็ยังเร็วกว่าแอปพลิเคชันแบบเต็มสแต็ก
ในงานที่ผ่านมาทีมของฉันจำเป็นต้องสร้างระบบ RESTful ที่มีภาระงานสูง สิ่งหนึ่งที่เราทำคือเปรียบเทียบประสิทธิภาพต้นแบบระหว่างแอปพลิเคชันแบบเต็มสแต็กใน Phalcon และแอปพลิเคชัน Phalcon micro เราพบว่าแอปพลิเคชันขนาดเล็กของ PhalconPHP มีแนวโน้มที่จะเร็วขึ้นมาก ฉันไม่สามารถแสดงการเปรียบเทียบใด ๆ ให้คุณเห็นได้เนื่องจากเหตุผลของ NDA แต่ในความคิดของฉันหากคุณต้องการใช้ประโยชน์สูงสุดจากประสิทธิภาพของ Phalcon ให้ใช้ไมโครแอปพลิเคชัน แม้ว่าจะสะดวกในการเขียนโค้ดไมโครแอปพลิเคชันน้อยกว่าแอปพลิเคชันแบบเต็มสแต็ก แต่แอปพลิเคชันขนาดเล็กของ PhalconPHP ยังคงมีทุกสิ่งที่คุณอาจต้องการสำหรับโครงการและประสิทธิภาพที่ดีขึ้น เพื่อเป็นตัวอย่างให้เขียนแอปพลิเคชัน RESTful micro ที่เรียบง่ายใน Phalcon
การเรียงสับเปลี่ยนเกือบทั้งหมดของแอปพลิเคชัน RESTful มีสิ่งหนึ่งที่เหมือนกัน: a User
นิติบุคคล. ดังนั้นสำหรับโครงการตัวอย่างของเราเราจะสร้างแอปพลิเคชัน REST ขนาดเล็กเพื่อสร้างอ่านอัปเดตและลบผู้ใช้ (หรือที่เรียกว่า ครูเอล ).
คุณสามารถดูโครงการนี้เสร็จสมบูรณ์ได้ที่ my ที่เก็บ GitLab . มีสองสาขาที่นั่นเพราะฉันตัดสินใจที่จะแบ่งโครงการนี้ออกเป็นสองส่วน: สาขาแรก master
มีฟังก์ชันพื้นฐานเท่านั้นโดยไม่มีคุณสมบัติเฉพาะของ PhalconPHP ในขณะที่สาขาที่สอง logging-and-cache
มีการบันทึกของ Phalcon และฟังก์ชันการแคช คุณสามารถเปรียบเทียบและดูว่าการใช้งานฟังก์ชันดังกล่าวใน Phalcon นั้นง่ายเพียงใด
ฉันจะไม่ไปติดตั้งมากกว่านี้: คุณสามารถใช้ฐานข้อมูลระบบปฏิบัติการและเว็บเซิร์ฟเวอร์ใดก็ได้ที่คุณต้องการ มีการอธิบายไว้อย่างดีในไฟล์ เอกสารการติดตั้งอย่างเป็นทางการ ดังนั้นเพียงทำตามคำแนะนำโดยขึ้นอยู่กับระบบปฏิบัติการของคุณ
หมายเหตุการติดตั้งเว็บเซิร์ฟเวอร์ยังมีอยู่ในไฟล์ เอกสาร Phalcon อย่างเป็นทางการ .
โปรดทราบว่าเวอร์ชัน PHP ของคุณไม่ควรน้อยกว่า 5.6
ฉันใช้ Ubuntu 16.10, PostgreSQL 9.5.6, Nginx 1.10.0, PHP 7 และ Phalcon 3.0 ฉันได้รวมตัวอย่างการกำหนดค่า Nginx และไฟล์ดัมพ์ PostgreSQL ไว้ในโปรเจ็กต์ดังนั้นอย่าลังเลที่จะใช้มัน หากคุณต้องการการกำหนดค่าแบบอื่นการเปลี่ยนแปลงจะไม่ยาก
ก่อนอื่นสร้างโครงสร้างโครงการเริ่มต้น
แม้ว่า Phalcon จะช่วยให้คุณใช้โครงสร้างที่คุณต้องการได้ แต่โครงสร้างที่ฉันเลือกสำหรับแบบฝึกหัดนี้บางส่วนจะใช้รูปแบบ MVC เราไม่มีมุมมองเนื่องจากเป็นโปรเจ็กต์ RESTful แต่เรามีตัวควบคุมและโมเดลแต่ละตัวมีโฟลเดอร์และบริการของตัวเอง บริการเป็นชั้นเรียนที่ใช้ตรรกะทางธุรกิจของโครงการโดยแบ่งส่วน 'แบบจำลอง' ของ MVC ออกเป็นสองส่วน ได้แก่ แบบจำลองข้อมูล (ซึ่งสื่อสารกับฐานข้อมูล) และแบบจำลองตรรกะทางธุรกิจ
index.php
ซึ่งอยู่ใน public
โฟลเดอร์เป็นไฟล์ bootstrap ที่โหลดส่วนและการกำหนดค่าที่จำเป็นทั้งหมด โปรดทราบว่าไฟล์การกำหนดค่าทั้งหมดของเราจะอยู่ใน config
โฟลเดอร์ เราสามารถใส่สิ่งเหล่านี้ลงในไฟล์ bootstrap ได้ (และนี่คือวิธีที่แสดงในเอกสารอย่างเป็นทางการ) แต่ในความคิดของฉันสิ่งนี้ไม่สามารถอ่านได้ในโปรเจ็กต์ขนาดใหญ่ดังนั้นฉันจึงชอบการแยกโฟลเดอร์ตั้งแต่แรก
เทคโนโลยีแอนิเมชั่นใดที่ผู้ใช้เว็บสามารถดูได้โดยไม่ต้องใช้ปลั๊กอินของเบราว์เซอร์
index.php
พาสแรกของเราที่ index.php
จะโหลดคลาสคอนฟิกูเรชันและโหลดอัตโนมัติจากนั้นกำหนดค่าเริ่มต้นเส้นทางคอนเทนเนอร์การฉีดแบบพึ่งพาและแอปพลิเคชันไมโคร PhalconPHP จากนั้นจะส่งผ่านการควบคุมไปยังแกนไมโครแอปพลิเคชันนั้นซึ่งจะจัดการคำขอตามเส้นทางเรียกใช้ตรรกะทางธุรกิจและส่งกลับผลลัพธ์
มาดูโค้ดกัน:
setDI($di); // Setting up routing require __DIR__ . '/../app/config/routes.php'; // Making the correct answer after executing $app->after( function () use ($app) { // Returning a successful response } ); // Processing request $app->handle(); } catch (Exception $e) { // Returning an error response }
PhalconConfig
วัตถุมีหลายวิธีในการจัดเก็บไฟล์คอนฟิกูเรชันใน Phalcon:
การจัดเก็บการกำหนดค่าของคุณในอาร์เรย์ PHP เป็นตัวเลือกที่เร็วที่สุดและเนื่องจากเรากำลังเขียนแอปพลิเคชันที่มีโหลดสูงและไม่จำเป็นต้องทำให้ประสิทธิภาพของเราช้าลงนี่คือสิ่งที่เราจะทำ โดยเฉพาะอย่างยิ่งเราจะใช้ PhalconConfig
วัตถุในการโหลดตัวเลือกการกำหนดค่าของเราลงในโครงการ เราจะมีออบเจ็กต์การกำหนดค่าที่สั้นมาก:
[ 'adapter' => 'Postgresql', 'host' => 'localhost', 'port' => 5432, 'username' => 'postgres', 'password' => '12345', 'dbname' => 'articledemo', ], 'application' => [ 'controllersDir' => 'app/controllers/', 'modelsDir' => 'app/models/', 'baseUri' => '/', ], ] );
ไฟล์นี้มีคอนฟิกูเรชันพื้นฐานสองแบบหนึ่งสำหรับฐานข้อมูลและอีกแบบสำหรับแอ็พพลิเคชัน เห็นได้ชัดว่าการกำหนดค่าฐานข้อมูลใช้สำหรับเชื่อมต่อกับฐานข้อมูลและสำหรับ application
อาร์เรย์เราจะต้องใช้ในภายหลังเนื่องจากเครื่องมือระบบของ Phalcon ใช้ คุณสามารถอ่านรายละเอียดเกี่ยวกับการกำหนดค่า Phalcon ได้ในไฟล์ เอกสารอย่างเป็นทางการ .
loader.php
มาดูไฟล์การกำหนดค่าถัดไปของเรา loader.php
loader.php
ไฟล์จะลงทะเบียนเนมสเปซกับไดเร็กทอรีที่เกี่ยวข้องผ่านทาง PhalconLoader
วัตถุ. มันง่ายกว่านั้น:
registerNamespaces( [ 'AppServices' => realpath(__DIR__ . '/../services/'), 'AppControllers' => realpath(__DIR__ . '/../controllers/'), 'AppModels' => realpath(__DIR__ . '/../models/'), ] ); $loader->register();
ตอนนี้คลาสทั้งหมดจากเนมสเปซเหล่านี้จะโหลดและพร้อมใช้งานโดยอัตโนมัติ หากคุณต้องการเพิ่มเนมสเปซและไดเร็กทอรีใหม่เพียงแค่เพิ่มบรรทัดในไฟล์นี้ คุณยังสามารถหลีกเลี่ยงการใช้เนมสเปซได้โดยการลงทะเบียนไดเร็กทอรีเฉพาะหรือไฟล์เฉพาะ ความเป็นไปได้ทั้งหมดนี้ได้อธิบายไว้ในไฟล์ เอกสารคู่มือตัวโหลด PhalconPHP .
เช่นเดียวกับเฟรมเวิร์กร่วมสมัยอื่น ๆ Phalcon ใช้รูปแบบการฉีดพึ่งพา (DI) วัตถุจะเริ่มต้นในคอนเทนเนอร์ DI และสามารถเข้าถึงได้จากมัน ในทำนองเดียวกันคอนเทนเนอร์ DI เชื่อมต่อกับวัตถุแอปพลิเคชันและจะสามารถเข้าถึงได้จากคลาสทั้งหมดที่สืบทอดมาจาก PhalconDIInjectable
คลาสเช่นตัวควบคุมและบริการของเรา
รูปแบบ DI ของ Phalcon มีประสิทธิภาพมาก ฉันคิดว่าองค์ประกอบนี้เป็นส่วนที่สำคัญที่สุดในกรอบนี้และฉันขอแนะนำให้คุณอ่านทั้งหมด เอกสารประกอบ เพื่อทำความเข้าใจวิธีการทำงาน เป็นกุญแจสำคัญในการทำงานหลายอย่างของ Phalcon
ลองมาดูบางส่วนของพวกเขา ของเรา di.php
ไฟล์จะมีลักษณะดังนี้:
setShared( 'response', function () { $response = new PhalconHttpResponse(); $response->setContentType('application/json', 'utf-8'); return $response; } ); /** Common config */ $di->setShared('config', $config); /** Database */ $di->set( 'db', function () use ($config) { return new Postgresql( [ 'host' => $config->database->host, 'username' => $config->database->username, 'password' => $config->database->password, 'dbname' => $config->database->dbname, ] ); } ); return $di;
อย่างที่คุณเห็นไฟล์การแทรกซึม (DI) ของเรามีความซับซ้อนกว่าเล็กน้อยและมีรายละเอียดบางอย่างที่คุณควรทราบ ก่อนอื่นให้พิจารณาสตริงการเริ่มต้น: $di = new PhalconDIFactoryDefault();
เราสร้าง FactoryDefault
วัตถุที่สืบทอด PhalconDi
(Phalcon อนุญาตให้คุณสร้างโรงงาน DI ที่คุณต้องการ) ตามเอกสาร, FactoryDefault
“ จะลงทะเบียนบริการทั้งหมดที่มีให้โดยกรอบงานโดยอัตโนมัติ ด้วยเหตุนี้นักพัฒนาจึงไม่จำเป็นต้องลงทะเบียนแต่ละบริการทีละรายการเพื่อให้มีกรอบงานสแต็กเต็มรูปแบบ” ซึ่งหมายความว่าบริการทั่วไปเช่น Request
และ Response
จะสามารถเข้าถึงได้ภายในคลาสเฟรมเวิร์ก คุณสามารถดูรายการบริการดังกล่าวทั้งหมดได้ในไฟล์ เอกสารบริการ Phalcon .
สิ่งที่สำคัญต่อไปคือขั้นตอนการตั้งค่า: มีหลายวิธีในการลงทะเบียนบางสิ่งในคอนเทนเนอร์ DI และทั้งหมดนี้อธิบายไว้อย่างสมบูรณ์ เอกสารการลงทะเบียน PhalconPHP . อย่างไรก็ตามในโครงการของเราเราใช้สามวิธี ได้แก่ ฟังก์ชันที่ไม่ระบุตัวตนตัวแปรและสตริง
ฟังก์ชันไม่ระบุชื่อช่วยให้เราสามารถทำสิ่งต่างๆได้มากมายในขณะที่เริ่มต้นคลาส ในโปรเจ็กต์นี้โดยเฉพาะเราจะแทนที่ Response
ก่อน เพื่อตั้งค่า content-type
เป็น JSON
สำหรับการตอบสนองทั้งหมดของโปรเจ็กต์จากนั้นเริ่มต้นอะแดปเตอร์ฐานข้อมูลโดยใช้ออบเจ็กต์การกำหนดค่าของเรา
ดังที่ได้กล่าวไปก่อนหน้านี้โครงการนี้ใช้ PostgreSQL หากคุณตัดสินใจที่จะใช้เครื่องมือฐานข้อมูลอื่นเพียงแค่เปลี่ยนอะแดปเตอร์ฐานข้อมูลใน db
ตั้งค่าฟังก์ชัน คุณสามารถอ่านเพิ่มเติมเกี่ยวกับอะแด็ปเตอร์ฐานข้อมูลที่มีอยู่และเกี่ยวกับเลเยอร์ฐานข้อมูลใน เอกสารฐานข้อมูลของ PhalconPHP .
สิ่งที่สามที่ควรทราบคือฉันลงทะเบียน $config
ตัวแปรที่ใช้ PhalconConfig
บริการ. แม้ว่าจะไม่ได้ใช้จริงในโครงการตัวอย่างของเรา แต่ฉันตัดสินใจรวมไว้ที่นี่เพราะเป็นหนึ่งในบริการที่ใช้บ่อยที่สุด โครงการอื่น ๆ อาจต้องเข้าถึงการกำหนดค่าเกือบทุกที่
สิ่งสุดท้ายที่น่าสนใจคือ setShared
วิธีการเอง การเรียกสิ่งนี้ทำให้บริการ 'ใช้ร่วมกัน' ซึ่งหมายความว่ามันเริ่มทำหน้าที่เหมือนซิงเกิลตัน ให้เป็นไปตาม เอกสารประกอบ :“ เมื่อบริการได้รับการแก้ไขเป็นครั้งแรกจะมีการส่งคืนอินสแตนซ์เดียวกันทุกครั้งที่ผู้บริโภคเรียกใช้บริการจากคอนเทนเนอร์”
asp.net core 2 และ angular 5
routes.php
…หรือไม่ไฟล์สุดท้ายที่รวมคือ routes.php
ตอนนี้ปล่อยว่างไว้ก่อน - เราจะเติมมันไว้ข้างคอนโทรลเลอร์ของเรา
อะไรทำให้โครงการเว็บ RESTful? ตาม Wikipedia แอปพลิเคชัน RESTful มีสามส่วนหลัก: - URL พื้นฐาน - ประเภทสื่ออินเทอร์เน็ตที่กำหนดองค์ประกอบข้อมูลการเปลี่ยนสถานะ - วิธี HTTP มาตรฐาน (GET
, POST
, PUT
, DELETE
) และรหัสตอบกลับ HTTP มาตรฐาน (200, 403, 400, 500 ฯลฯ )
ในโครงการของเรา URL พื้นฐานจะถูกวางไว้ใน routes.php
ไฟล์และประเด็นอื่น ๆ ที่กล่าวถึงจะได้รับการอธิบายในตอนนี้
เราจะได้รับข้อมูลคำขอเป็น application/x-www-form-urlencoded
และส่งข้อมูลการตอบกลับเป็น application/json
แม้ว่าฉันจะไม่เชื่อว่ามันเป็นความคิดที่ดีที่จะใช้ x-www-form-urlencoded
ในแอปพลิเคชันจริง (เนื่องจากคุณต้องดิ้นรนในการส่งโครงสร้างข้อมูลที่ซับซ้อนและอาร์เรย์ที่เชื่อมโยงกับ x-www-form-urlencoded
) ฉันจึงตัดสินใจใช้มาตรฐานนี้เพื่อความเรียบง่าย
หากคุณจำได้เราได้ตั้งค่าส่วนหัว JSON ตอบกลับไว้ในไฟล์ DI ของเราแล้ว:
$di->setShared( 'response', function () { $response = new PhalconHttpResponse(); $response->setContentType('application/json', 'utf-8'); return $response; } );
ตอนนี้เราต้องตั้งค่ารหัสตอบกลับและรูปแบบการตอบกลับ กวดวิชาอย่างเป็นทางการ แนะนำว่าเราสร้างการตอบกลับ JSON ในทุก ๆ วิธี แต่ฉันไม่คิดว่าเป็นความคิดที่ดี เป็นสากลมากขึ้นในการส่งคืนผลลัพธ์วิธีการควบคุมเป็นอาร์เรย์แล้วแปลงเป็นการตอบสนอง JSON มาตรฐาน นอกจากนี้ยังควรสร้างรหัสตอบกลับ HTTP ในที่เดียวภายในโปรเจ็กต์ เราจะทำสิ่งนี้ใน index.php
ของเรา ไฟล์.
ในการดำเนินการนี้เราจะใช้ความสามารถของ Phalcon ในการรันโค้ดก่อนและหลังการจัดการคำขอด้วย $app->before()
และ $app->after()
วิธีการ เราจะโทรกลับใน $app->after()
วิธีการสำหรับวัตถุประสงค์ของเรา:
// Making the correct answer after executing $app->after( function () use ($app) { // Getting the return value of method $return = $app->getReturnedValue(); if (is_array($return)) { // Transforming arrays to JSON $app->response->setContent(json_encode($return)); } elseif (!strlen($return)) { // Successful response without any content $app->response->setStatusCode('204', 'No Content'); } else { // Unexpected response throw new Exception('Bad Response'); } // Sending response to the client $app->response->send(); }
ที่นี่เราได้รับค่าส่งคืนและแปลงอาร์เรย์เป็น JSON หากทุกอย่างเรียบร้อย แต่ค่าที่ส่งกลับว่างเปล่า (ตัวอย่างเช่นหากเราเพิ่มผู้ใช้ใหม่สำเร็จ) เราจะให้รหัส HTTP 204 และไม่ส่งเนื้อหาใด ๆ ในกรณีอื่น ๆ เรามีข้อยกเว้น
สิ่งที่สำคัญที่สุดประการหนึ่งของแอปพลิเคชัน RESTful คือการตอบสนองที่ถูกต้องและให้ข้อมูล โดยทั่วไปแอปพลิเคชันที่มีภาระงานสูงมักมีขนาดใหญ่และข้อผิดพลาดประเภทต่างๆอาจเกิดขึ้นได้ทุกที่: ข้อผิดพลาดในการตรวจสอบข้อผิดพลาดในการเข้าถึงข้อผิดพลาดในการเชื่อมต่อข้อผิดพลาดที่ไม่คาดคิด ฯลฯ เราต้องการแปลงข้อผิดพลาดเหล่านี้ทั้งหมดให้เป็นรหัสตอบกลับ HTTP สามารถทำได้อย่างง่ายดายด้วยความช่วยเหลือของข้อยกเว้น
ในโครงการของฉันฉันตัดสินใจใช้ข้อยกเว้นสองประเภทที่แตกต่างกัน: มีข้อยกเว้น 'ท้องถิ่น' - ชั้นเรียนพิเศษที่สืบทอดมาจาก RuntimeException
คลาสแยกตามบริการโมเดลอะแดปเตอร์และอื่น ๆ (การแบ่งดังกล่าวจะช่วยให้แต่ละระดับของโมเดล MVC แยกจากกัน) จากนั้นจะมี HttpExceptions
ซึ่งสืบทอดมาจาก AbstractHttpException
ชั้นเรียน. ข้อยกเว้นเหล่านี้สอดคล้องกับรหัสตอบกลับ HTTP ดังนั้นชื่อจึงเป็น Http400Exception
, Http500Exception
และอื่น ๆ
AbstractHttpException
คลาสมีคุณสมบัติสามประการ: httpCode
, httpMessage
และ appError
. คุณสมบัติสองประการแรกถูกแทนที่ในผู้รับช่วงและมีข้อมูลการตอบกลับพื้นฐานเช่น httpCode: 400
และ httpMessage: Bad request
. appError
คุณสมบัติคืออาร์เรย์ของข้อมูลข้อผิดพลาดโดยละเอียดรวมถึงคำอธิบายข้อผิดพลาด
index.php
เวอร์ชันสุดท้ายของเรา จะมีข้อยกเว้นสามประเภท: AbstractHttpExceptions
ตามที่อธิบายไว้ข้างต้น; ข้อยกเว้นของคำขอ Phalcon ซึ่งอาจเกิดขึ้นขณะแยกวิเคราะห์คำขอ และข้อยกเว้นอื่น ๆ ที่ไม่คาดคิดทั้งหมด ทั้งหมดจะถูกแปลงเป็นรูปแบบ JSON ที่สวยงามและส่งไปยังไคลเอนต์ผ่านคลาส Phalcon Response มาตรฐาน:
setDI($di); // Setting up routing require __DIR__ . '/../app/config/routes.php'; // Making the correct answer after executing $app->after( // After Code ); // Processing request $app->handle(); } catch (AbstractHttpException $e) { $response = $app->response; $response->setStatusCode($e->getCode(), $e->getMessage()); $response->setJsonContent($e->getAppError()); $response->send(); } catch (PhalconHttpRequestException $e) { $app->response->setStatusCode(400, 'Bad request') ->setJsonContent([ AbstractHttpException::KEY_CODE => 400, AbstractHttpException::KEY_MESSAGE => 'Bad request' ]) ->send(); } catch (Exception $e) { // Standard error format $result = [ AbstractHttpException::KEY_CODE => 500, AbstractHttpException::KEY_MESSAGE => 'Some error occurred on the server.' ]; // Sending error response $app->response->setStatusCode(500, 'Internal Server Error') ->setJsonContent($result) ->send(); }
หากคุณใช้ IDE ร่วมสมัยคุณอาจคุ้นเคยกับการเน้นโค้ดและการทำให้เสร็จสมบูรณ์ ในทำนองเดียวกันใน PHP framework ทั่วไปคุณสามารถรวมโฟลเดอร์ที่มีกรอบเพื่อไปที่การประกาศฟังก์ชันได้ในคลิกเดียว เนื่องจาก Phalcon เป็นส่วนขยายเราจึงไม่ได้รับตัวเลือกนี้โดยอัตโนมัติ โชคดีที่มีเครื่องมือที่เติมเต็มช่องว่างนี้เรียกว่า“ Phalcon Dev Tools” ซึ่งสามารถติดตั้งผ่านไฟล์ นักแต่งเพลง (หากคุณยังไม่รู้ว่ามันคืออะไรตอนนี้ถึงเวลาทำความรู้จักกับผู้จัดการแพ็กเกจที่น่าทึ่งนี้) Phalcon Dev Tools ประกอบด้วยต้นขั้วรหัสสำหรับคลาสและฟังก์ชั่นทั้งหมดใน Phalcon และมีตัวสร้างโค้ดบางตัวที่มีทั้งเวอร์ชันคอนโซลและ GUI ซึ่งบันทึกไว้ใน เว็บไซต์ PhalconPHP . เครื่องมือเหล่านี้สามารถช่วยในการสร้างทุกส่วนของรูปแบบ MVC แต่เราจะครอบคลุมเฉพาะการสร้างโมเดลเท่านั้น
ตกลงมาติดตั้ง Phalcon Dev Tools ผ่าน Composer กัน ของเรา composer.json
ไฟล์จะมีลักษณะดังนี้:
{ 'require': { 'php': '>=5.6.0', 'ext-phalcon': '>=3', 'ext-pgsql': '*' }, 'require-dev': { 'phalcon/devtools': '3.*.*@dev' } }
อย่างที่คุณเห็นเราต้องการ PHP 5.6, Phalcon 3 และ pgsql
ส่วนขยาย (ซึ่งคุณสามารถเปลี่ยนเป็นส่วนขยายฐานข้อมูลของคุณหรือไม่รวมทั้งหมด)
ตรวจสอบให้แน่ใจว่าคุณมีเวอร์ชันส่วนขยาย PHP, Phalcon และ DB ที่ถูกต้องและเรียกใช้ตัวแต่ง:
$ composer install
ขั้นตอนต่อไปคือการสร้างฐานข้อมูลของเรา มันง่ายมากและประกอบด้วยตารางเดียวเท่านั้น users
แม้ว่าฉันจะรวม pg_dump
ไฟล์ในโครงการนี่คือ SQL ในภาษา PostgreSQL:
CREATE DATABASE articledemo; CREATE TABLE public.users ( id INTEGER PRIMARY KEY NOT NULL DEFAULT nextval('users_id_seq'::regclass), first_name CHARACTER VARYING(255), last_name CHARACTER VARYING(255), pass CHARACTER VARYING(255), login CHARACTER VARYING(255) NOT NULL );
เมื่อสร้างฐานข้อมูลแล้วเราสามารถดำเนินการขั้นตอนการสร้างแบบจำลองได้ Phalcon Dev Tools ใช้ .phalcon
ที่ว่างเปล่า เพื่อตรวจสอบว่าแอปพลิเคชันเป็นโปรเจ็กต์ Phalcon หรือไม่ดังนั้นคุณจะต้องสร้างโฟลเดอร์ว่างนี้ในรูทโปรเจ็กต์ของคุณ นอกจากนี้ยังใช้การตั้งค่าบางอย่างจากไฟล์การกำหนดค่าที่เราสร้างขึ้นซึ่งเป็นตัวแปรทั้งหมดที่เก็บไว้ใน application
มาตราและ adapter
จาก database
มาตรา. ในการสร้างโมเดลของเราเราต้องดำเนินการคำสั่งต่อไปนี้จากโฟลเดอร์รูทของโปรเจ็กต์:
$ php vendor/phalcon/devtools/phalcon.php model users --namespace='AppModels' --get-set
หากทำตามขั้นตอนก่อนหน้าทั้งหมดอย่างถูกต้องคุณจะได้รับไฟล์โมเดลการทำงาน Users.php
ใน models
วางไว้แล้วในเนมสเปซที่มี getters และ setters ตามบรรทัดคำสั่งที่ระบุ ถัดไปคือตัวควบคุม
เนื่องจากแอปพลิเคชันของเรามีเพียง CRUD (สร้างอ่านอัปเดตและลบ) ผู้ใช้เราจะสร้างตัวควบคุมเพียงตัวเดียวคือ Users
ตัวควบคุมด้วยการดำเนินการดังต่อไปนี้:
ในขณะที่สามารถสร้างคอนโทรลเลอร์ได้ด้วยความช่วยเหลือของ Phalcon Dev Tools แต่เราจะดำเนินการด้วยตนเองและใช้ AbstractController
และลูกของมัน, UsersController
.
aws โซลูชั่น สถาปนิก สอบสมทบ
การสร้าง AbstractController
เป็นการตัดสินใจที่ดีสำหรับ Phalcon เพราะเราสามารถวางคลาสที่จำเป็นทั้งหมดซึ่งเราจะได้รับจากการฉีดการพึ่งพาลงในบล็อก PHPDoc สิ่งนี้จะช่วยในการเติมข้อความอัตโนมัติ IDE นอกจากนี้เรายังสามารถตั้งโปรแกรมในค่าคงที่ข้อผิดพลาดบางอย่างซึ่งเป็นเรื่องธรรมดาสำหรับตัวควบคุมที่มีศักยภาพทั้งหมด
สำหรับตอนนี้ตัวควบคุมนามธรรมของเราจะมีลักษณะดังนี้:
เพียงคลาสฉีด Phalcon ธรรมดาตามที่ระบุโดย extends
ไวยากรณ์ไม่มีอะไรมาก ต่อไปมาสร้าง UsersController
โครงกระดูก:
ในขณะนี้เป็นเพียงชั้นเรียนที่มีการดำเนินการว่างเปล่าซึ่งในที่สุดจะมีคำขอ HTTP ที่เกี่ยวข้อง
ตอนนี้ได้เวลากรอก routes.php
ไฟล์. ในแอปพลิเคชัน Phalcon micro เราสร้างคอลเล็กชันหนึ่งชุดสำหรับคอนโทรลเลอร์แต่ละตัวและเพิ่มคำขอที่จัดการทั้งหมดเป็น get
, post
, put
, delete
วิธีการซึ่งใช้รูปแบบเส้นทางและฟังก์ชันการดำเนินการเป็นอาร์กิวเมนต์ โปรดทราบว่าฟังก์ชันการดำเนินการควรเป็นฟังก์ชันที่ไม่ระบุตัวตนหรือชื่อวิธีการของคอนโทรลเลอร์ นี่คือสิ่งที่ routes.php
ของเรา ดูเหมือนว่าไฟล์:
setHandler('AppControllersUsersController', true); $usersCollection->setPrefix('/user'); $usersCollection->post('/add', 'addAction'); $usersCollection->get('/list', 'getUserListAction'); $usersCollection->put('/{userId:[1-9][0-9]*}', 'updateUserAction'); $usersCollection->delete('/{userId:[1-9][0-9]*}', 'deleteUserAction'); $app->mount($usersCollection); // not found URLs $app->notFound( function () use ($app) { $exception = new AppControllersHttpExceptionsHttp404Exception( _('URI not found or error in request.'), AppControllersAbstractController::ERROR_NOT_FOUND, new Exception('URI not found: ' . $app->request->getMethod() . ' ' . $app->request->getURI()) ); throw $exception; } );
เรายังตั้งค่าตัวควบคุมการจัดการและคำนำหน้า URI สำหรับตัวอย่างของเรา URI จะมีลักษณะเป็น http://article.dev/user/add
และจะต้องเป็น post
คำขอ. หากเราต้องการเปลี่ยนข้อมูลผู้ใช้ URI จะต้องเป็น put
ร้องขอและจะมีลักษณะดังนี้ http://article.dev/user/12
เพื่อเปลี่ยนข้อมูลสำหรับผู้ใช้ด้วย ID 12
เรายังกำหนดตัวจัดการ URL ที่ไม่พบซึ่งทำให้เกิดข้อผิดพลาด สำหรับข้อมูลเพิ่มเติมโปรดดูเอกสาร PhalconPHP สำหรับ เส้นทางในแอปพลิเคชันสแต็กแบบเต็ม และสำหรับเส้นทางในก ไมโครแอปพลิเคชัน .
เรามาดูตัวควบคุมกันดีกว่าโดยเฉพาะ addAction
วิธีการ (วิธีอื่น ๆ ทั้งหมดคล้ายกันคุณสามารถดูได้ในรหัสแอปพลิเคชัน) วิธีการควบคุมทำห้าสิ่ง:
- รับและตรวจสอบพารามิเตอร์คำขอ
- เตรียมข้อมูลสำหรับวิธีการบริการ
- เรียกใช้วิธีการบริการ
- จัดการข้อยกเว้น
- ส่งการตอบกลับ
เรามาดูแต่ละขั้นตอนโดยเริ่มจากการตรวจสอบความถูกต้อง ในขณะที่ Phalcon มีพลัง องค์ประกอบการตรวจสอบความถูกต้อง ในกรณีนี้การตรวจสอบความถูกต้องของข้อมูลในรูปแบบเก่าจะสะดวกกว่ามากดังนั้นบล็อกการตรวจสอบความถูกต้องของเราจะมีลักษณะดังนี้:
$errors = []; $data = []; $data['login'] = $this->request->getPost('login'); if (!is_string($data['login']) || !preg_match('/^[A-z0-9_-]{3,16}$/', $data['login'])) { $errors['login'] = 'Login must consist of 3-16 latin symbols, numbers or '-' and '_' symbols'; }
ที่นี่เราตรวจสอบว่า post
พารามิเตอร์คือสตริงที่ตรงกับนิพจน์ทั่วไป ค่าทั้งหมดจะถูกใส่ลงใน $data
อาร์เรย์ซึ่งจะถูกส่งไปยัง UsersService
ชั้นเรียน. ข้อผิดพลาดทั้งหมดจะอยู่ใน $errors
อาร์เรย์ซึ่งจะถูกเพิ่มลงในอาร์เรย์ของรายละเอียดข้อผิดพลาดภายใน Http400Exception
ซึ่งจะถูกเปลี่ยนเป็นการตอบสนองโดยละเอียดที่เห็นใน index.php
:
นี่คือตัวเต็ม addAction
รหัสวิธีการที่มีการตรวจสอบความถูกต้องทั้งหมดซึ่งรวมถึงการเรียกไปที่ createUser
วิธีการใน UsersService
(ซึ่งเรายังไม่ได้สร้าง):
public function addAction() { /** Init Block **/ $errors = []; $data = []; /** End Init Block **/ /** Validation Block **/ $data['login'] = $this->request->getPost('login'); if (!is_string($data['login']) || !preg_match('/^[A-z0-9_-]{3,16}$/', $data['login'])) { $errors['login'] = 'Login must consist of 3-16 latin symbols, numbers or '-' and '_' symbols'; } $data['password'] = $this->request->getPost('password'); if (!is_string($data['password']) || !preg_match('/^[A-z0-9_-]{6,18}$/', $data['password'])) { $errors['password'] = 'Password must consist of 6-18 latin symbols, numbers or '-' and '_' symbols'; } $data['first_name'] = $this->request->getPost('first_name'); if ((!empty($data['first_name'])) && (!is_string($data['first_name']))) { $errors['first_name'] = 'String expected'; } $data['last_name'] = $this->request->getPost('last_name'); if ((!empty($data['last_name'])) && (!is_string($data['last_name']))) { $errors['last_name'] = 'String expected'; } if ($errors) { $exception = new Http400Exception(_('Input parameters validation error'), self::ERROR_INVALID_REQUEST); throw $exception->addErrorDetails($errors); } /** End Validation Block **/ /** Passing to business logic and preparing the response **/ try { $this->usersService->createUser($data); } catch (ServiceException $e) { switch ($e->getCode()) { case AbstractService::ERROR_ALREADY_EXISTS: case UsersService::ERROR_UNABLE_CREATE_USER: throw new Http422Exception($e->getMessage(), $e->getCode(), $e); default: throw new Http500Exception(_('Internal Server Error'), $e->getCode(), $e); } } /** End Passing to business logic and preparing the response **/ }
อย่างที่คุณเห็นเราจัดการข้อยกเว้นที่ทราบสองข้อในส่วนสุดท้าย: user already exists
และ unable to create user
เนื่องจากปัญหาภายในบางอย่างเช่นข้อผิดพลาดในการเชื่อมต่อฐานข้อมูล โดยค่าเริ่มต้นข้อยกเว้นที่ไม่รู้จักจะถูกโยนเป็น HTTP 500
(ข้อผิดพลาดภายในเซิร์ฟเวอร์) แม้ว่าเราจะไม่ให้รายละเอียดใด ๆ กับผู้ใช้ แต่ขอแนะนำอย่างยิ่งให้เก็บรายละเอียดข้อผิดพลาดทั้งหมด (รวมถึงการติดตาม) ไว้ในบันทึก
และโปรดอย่าลืม use
คลาสที่จำเป็นทั้งหมดยืมมาจากเนมสเปซอื่น:
use AppControllersHttpExceptionsHttp400Exception; use AppControllersHttpExceptionsHttp422Exception; use AppControllersHttpExceptionsHttp500Exception; use AppServicesAbstractService; use AppServicesServiceException; use AppServicesUsersService;
ตรรกะทางธุรกิจ
ส่วนสุดท้ายที่จะสร้างคือตรรกะทางธุรกิจ เช่นเดียวกับคอนโทรลเลอร์เราจะสร้างคลาสบริการนามธรรม:
แนวคิดนี้เหมือนกับในบล็อกของคอนโทรลเลอร์ทั้งหมดดังนั้นฉันจะไม่แสดงความคิดเห็น นี่คือโครงกระดูกของ UsersService
ของเรา ชั้น:
และ createUser
วิธีการเอง:
public function createUser(array $userData) { try { $user = new Users(); $result = $user->setLogin($userData['login']) ->setPass(password_hash($userData['password'], PASSWORD_DEFAULT)) ->setFirstName($userData['first_name']) ->setLastName($userData['last_name']) ->create(); if (!$result) { throw new ServiceException('Unable to create user', self::ERROR_UNABLE_CREATE_USER); } } catch (PDOException $e) { if ($e->getCode() == 23505) { throw new ServiceException('User already exists', self::ERROR_ALREADY_EXISTS, $e); } else { throw new ServiceException($e->getMessage(), $e->getCode(), $e); } } }
วิธีนี้ง่ายที่สุดเท่าที่จะทำได้ เราเพิ่งสร้างอ็อบเจ็กต์โมเดลใหม่เรียกตัวเซ็ตเตอร์ (ซึ่งส่งคืนอ็อบเจ็กต์เองซึ่งทำให้เราสามารถสร้าง call chain) และโยน ServiceException
ในกรณีที่เกิดข้อผิดพลาด แค่นั้นแหละ! ตอนนี้เราสามารถดำเนินการทดสอบได้
การทดสอบ
ตอนนี้เรามาดูผลลัพธ์โดยใช้ บุรุษไปรษณีย์ . มาทดสอบข้อมูลถังขยะก่อน:

คำขอ:
POST http://article.dev/user/add login:1 password:1 first_name:Name last_name:Sourname
การตอบสนอง (400: คำขอที่ไม่ถูกต้อง):
{ 'error': 2, 'error_description': 'Input parameters validation error', 'details': { 'login': 'Login must consist of 3-16 latin symbols, numbers or '-' and '_' symbols', 'password': 'Password must consist of 6-18 latin symbols, numbers or '-' and '_' symbols' } }
ที่เช็คเอาท์ ตอนนี้สำหรับข้อมูลที่ถูกต้อง:

คำขอ:
POST http://article.dev/user/add login:user4 password:password4 first_name:Name last_name:Sourname
ตอบกลับ (204):
ไม่มีเนื้อหาซึ่งเป็นสิ่งที่เราคาดหวัง ตอนนี้ตรวจสอบให้แน่ใจว่าใช้งานได้และรับรายชื่อผู้ใช้ทั้งหมด (ซึ่งเราไม่ได้อธิบายไว้ในบทความ แต่คุณสามารถดูได้ในตัวอย่างแอปพลิเคชัน):
คำขอ:
GET http://article.dev/user/list
การตอบสนอง (200 OK):
ไฟล์ส่วนหัวคอมไพล์ c++
[ { 'id': 1, 'login': 'user4', 'first_name': 'Name', 'last_name': 'Sourname' } ]
มันได้ผล!
การบันทึกและการแคช
มันยากที่จะจินตนาการถึงแอปพลิเคชันที่มีโหลดสูงโดยไม่ต้องบันทึกและแคชและ Phalcon มีคลาสที่น่าดึงดูดใจมาก แต่ฉันกำลังเขียนบทความที่นี่ไม่ใช่หนังสือ ฉันได้เพิ่มการบันทึกและการแคชลงในแอปพลิเคชันตัวอย่าง แต่ฉันได้วางรหัสนี้ไว้ในสาขาอื่นชื่อ logging-and-cache
เพื่อให้คุณสามารถดูและดูความแตกต่างของโค้ดได้อย่างง่ายดาย เช่นเดียวกับคุณสมบัติอื่น ๆ ของ Phalcon ทั้งสองนี้ได้รับการบันทึกไว้เป็นอย่างดี: การบันทึก และ เก็บเอาไว้ .
ข้อเสีย
อย่างที่คุณเห็น Phalcon นั้นเจ๋งมาก แต่ก็เหมือนกับเฟรมเวิร์กอื่น ๆ มันก็มีข้อเสียซึ่งอย่างแรกก็เหมือนกับข้อได้เปรียบหลักนั่นคือส่วนขยาย C ที่คอมไพล์แล้ว นั่นคือเหตุผลที่คุณไม่สามารถเปลี่ยนรหัสได้อย่างง่ายดาย ถ้าคุณรู้จัก C คุณสามารถพยายามทำความเข้าใจรหัสและทำการเปลี่ยนแปลงบางอย่างเรียกใช้ make
และรับการปรับเปลี่ยน Phalcon ของคุณเอง แต่มันซับซ้อนกว่าการปรับแต่งโค้ด PHP ดังนั้นโดยทั่วไปหากคุณพบข้อบกพร่องภายใน Phalcon ก็จะไม่สามารถแก้ไขได้ง่ายนัก
สิ่งนี้แก้ไขได้บางส่วนใน Phalcon 2 และ Phalcon 3 ซึ่งให้คุณเขียนส่วนขยายไปยัง Phalcon ใน Zephir . Zephir เป็นภาษาโปรแกรมที่ออกแบบมาเพื่อลดความสะดวกในการสร้างและบำรุงรักษาส่วนขยายสำหรับ PHP โดยเน้นที่ประเภทและความปลอดภัยของหน่วยความจำ ไวยากรณ์ใกล้เคียงกับ PHP มากและโค้ด Zephir ถูกรวบรวมไว้ในไลบรารีที่ใช้ร่วมกันเช่นเดียวกับส่วนขยาย PHP ดังนั้นหากคุณต้องการปรับปรุง Phalcon ตอนนี้คุณสามารถทำได้
ข้อเสียประการที่สองคือโครงสร้างกรอบอิสระ แม้ว่า Symfony จะทำให้นักพัฒนาใช้โครงสร้างโครงการที่มั่นคง แต่ Phalcon ก็มีกฎที่เข้มงวดน้อยมาก นักพัฒนาสามารถสร้างโครงสร้างใดก็ได้ที่พวกเขาต้องการแม้ว่าจะมีโครงสร้างที่แนะนำโดยผู้เขียนก็ตาม นี่ไม่ใช่ข้อเสียที่สำคัญ แต่บางคนอาจคิดว่ามันดิบเกินไปเมื่อคุณเขียนพา ธ ไปยังไดเร็กทอรีทั้งหมดในไฟล์ bootstrap ด้วยตนเอง
PhalconPHP: ไม่ใช่แค่สำหรับแอพที่มีโหลดสูง
ฉันหวังว่าคุณจะสนุกกับภาพรวมคร่าวๆของคุณสมบัติการฆ่าของ PhalconPHP และตัวอย่างง่ายๆที่มาพร้อมกับโครงการ Phalcon เห็นได้ชัดว่าฉันไม่ได้กล่าวถึงความเป็นไปได้ทั้งหมดของกรอบงานนี้เนื่องจากเป็นไปไม่ได้ที่จะอธิบายทั้งหมดในบทความเดียว แต่โชคดีที่ Phalcon มีรายละเอียดที่ยอดเยี่ยม เอกสารประกอบ ด้วยเจ็ดมหัศจรรย์ บทเรียน ซึ่งช่วยให้คุณเข้าใจเกือบทุกอย่างเกี่ยวกับ Phalcon
ตอนนี้คุณมีวิธีใหม่ล่าสุดในการสร้างแอปพลิเคชันที่มีภาระงานสูงได้อย่างง่ายดายและคุณจะพบว่าถ้าคุณชอบ Phalcon ก็อาจเป็นทางเลือกที่ดีสำหรับแอปพลิเคชันประเภทอื่น ๆ เช่นกัน