
CIRO เป็นเฟรมเวิร์ก MVC PHP ในการเริ่มต้นโครงการอย่างรวดเร็วมันถูกออกแบบมาให้เรียบง่ายกำหนดค่าได้โมดูลแยกส่วนขยายได้และมีน้ำหนักเบาเพื่อให้ง่ายขึ้นในการสร้างรหัส PHP ที่ดีขึ้นและง่ายดาย
ออกมาจากกล่อง Ciro มาพร้อมกับ:
Ciro มาพร้อมกับโครงการเทมเพลตที่มีระบบตรวจสอบความถูกต้องอย่างง่ายเพื่อเริ่มพัฒนาโครงการหรือต้นแบบของคุณ
ตัวอย่างออนไลน์ของโครงการเทมเพลตเฟรมเวิร์ก: https://ciro-framework.herokuapp.com
C:xampphtdocs สำหรับ Windows หรือ /Applications/XAMPP/xamppfiles/htdocs สำหรับ Machttpd.conf ของ Apache ของ XAMPP ไปยังไดเรกทอรีของ CIRO ดูคำแนะนำ: ที่นี่ในการใช้การเข้าสู่ระบบ/ลงทะเบียนล่วงหน้าและคุณ ใช้ SQL (ไม่ใช่ Mongo) คุณต้องสร้างฐานข้อมูลและตารางใน SQL
http://localhost/phpmyadmin และดำเนินการค้นหาใน sql_database_script.sql ที่มีอยู่ในไดเรกทอรีราก ในการใช้การเข้าสู่ระบบ/ลงทะเบียนล่วงหน้าและคุณต้องการ ใช้ MongoDB คุณต้องติดตั้ง mongodb extension และ MongoDB PHP Library โดยใช้นักแต่งเพลงคำแนะนำที่นี่ นอกจากนี้ยังแทนที่ Models/UserRepository.php ด้วย Models.disabled.mongo.userrepository.class.php เพื่อใช้รุ่น MongoDB
Mysqli สำหรับ mysqlPDO สำหรับ RDBMS ที่รองรับ PDOMongoDB เวอร์ชัน (Php 7.0+)สามารถกำหนดค่าได้ทั้งหมดผ่านไฟล์ config

โครงสร้างโครงการเป็นไปตามข้อกำหนดของ PSR-4 ที่กำหนดเอง
+---Config <- Contains Configurations Files.
+---Controllers <- Contains a Dir for each Route each contains this Route's Controllers.
+---Core <- Contains Core Classes for the framework
+---Logs <- Contains Logs created by the scripts (e.g Exception Handler logs)
+---Models <- Contains Models (can be sub-directoried using namespaces using PSR-4 specs.
+---Utilities <- Contains Utility Classes.
+---Vendor <- Composer's Vendor Dir, contains autoloader code and third-party packeges.
+---Views <- Contains Views, a Dir for each route, each contains a Dir for each Controller.
| +---_FullMessages <- Contains Full Messages HTML designs.
| +---_Layouts <- Contains Layouts
+---Webroot <- Public Dir contains the single point of entry of the program, and all public assets.
ใน CIRO เส้นทาง URL เริ่มต้นมีโครงสร้างดังต่อไปนี้:
http://example.io/{route}/{controller}/{action}/{param1?}/{param2?}/...
URL นี้จะแก้ไขไปยังเมธอด {action} ของคอนโทรลเลอร์ {controller} ใน controllers/{route} ดังนั้นในสัญกรณ์ php oop สอดคล้องกับ:
App Controllers { route }{controller} -> { action } ใน configuration Config/config.php คุณสามารถระบุ 'default_route' ดังนั้นหาก URL ไม่มีเส้นทางโปรแกรมจะกำหนดเส้นทางตามเส้นทางเริ่มต้น โดยค่าเริ่มต้น 'default_route' คือ 'เว็บ' ดังนั้น URL ทั่วไปที่ใช้เส้นทางเริ่มต้นจะมีโครงสร้างดังต่อไปนี้:
http://example.io/{controller}/{action}/{param1?}/{param2?}/...
ดังนั้นในสัญกรณ์ php oop สอดคล้องกับ:
App Controllers Web {controller} -> { action }อีกตัวอย่างหนึ่ง:
for $id
http://example.io/{controller}/{action}/{param1}
http://example.io/ Product / View / 6800
หาก URL ไม่ได้ระบุ {action} โปรแกรมที่จะกำหนดเส้นทางไปยัง 'default_action' ที่ระบุใน 'config/config.php'
หาก URL ไม่ได้ระบุ {controller} โปรแกรมที่จะกำหนดเส้นทางไปยัง 'default_controller' ที่ระบุใน 'config/config.php'
ในการเพิ่มเส้นทางใหม่และเข้าถึงโดยใช้การกำหนดเส้นทางเริ่มต้นคุณต้องเพิ่มในตารางการกำหนดเส้นทาง Config/config.php
ให้ URL นี้ตัวอย่างเช่น:
for $id $color
http://example.io/{controller}/{action}/{param1}/{param2}
http://example.io/ Product / View / 6800 / red
พารามิเตอร์สามารถเข้าถึงได้ภายในวิธีการของคอนโทรลเลอร์ผ่าน $this -> params[0..*] อาร์เรย์ตัวอย่างเช่น $this->params[0] ถือค่าของ {param1} ใน URL ด้านบน
อีกวิธีหนึ่งในการเข้าถึงพารามิเตอร์ภายในวิธีการของคอนโทรลเลอร์คือการเพิ่มอาร์กิวเมนต์ลงในวิธีการของคอนโทรลเลอร์เอง ใช้ตัวอย่างเดียวกันด้านบนหาก ProductController -> View ถูกกำหนดเช่นนี้:
class ProductController extends WebController {
public function view ( $ id , $ color = ' white ' ){
/* controller's method code here */
}
} $id จะมีค่า {param1} , $color จะมีค่าของ {param2} และอื่น ๆ ...
ขอให้สังเกต ว่าหาก {param2} ไม่ได้อยู่ใน URL, $color จะใช้ค่าเริ่มต้นที่ระบุอย่างไรก็ตามหาก {param1} ไม่ได้อยู่ใน URL โปรแกรมจะแสดงผล 404: Not Found ข้อความเพราะ $id ไม่มีค่าเริ่มต้นที่ระบุในวิธีการของคอนโทรลเลอร์
เส้นทางที่กำหนดเองให้ความเป็นไปได้ที่จะ ระบุ URL ที่มีรูปแบบเฉพาะ ที่หากจับคู่ URL จะถูกกำหนดเส้นทางไปยัง {route}{controller}::{action} ที่ระบุด้วยพารามิเตอร์ที่ระบุที่เหมาะสม
เส้นทางที่กำหนดเองสามารถเปิดใช้งาน/ปิดใช้งานใน Config/config.php
คุณสามารถระบุเส้นทางที่กำหนดเองสำหรับทุกส่วนที่เหลือ http verb เช่น ( GET, POST, PUT, DELETE, etc ) หรือระบุเส้นทางที่กำหนดเองสำหรับคำกริยา HTTP ที่เป็นไปได้ทั้งหมดโดยใช้:
// for GET requests
Route:: get ( $ uri , $ route , $ controller , $ action );
// same for POST, PUT, DELETE, etc requests
Route:: post (), Route:: put (), Route:: delete (), Route:: patch (), Route:: options ();
// for ALL requests
Route:: all ();เส้นทางที่กำหนดเองถูกกำหนดใน /config/routes.php
Route:: get ( ' custom/route/{id}/{name}/{language?} ' , ' Web ' , ' Home ' , ' CustomRouteAction ' ); URL ใด ๆ ที่ตรงกับ custom/route/{id}/{name}/{language?} จะถูกส่งไปยัง: เส้นทาง: Web คอนโทรลเลอร์ Home การกระทำที่บ้าน: CustomRouteAction
{ name } พารามิเตอร์ทางเลือกควรมี '?' ในตอนท้ายของชื่อ { optinoalParam? } .$this -> params[0..*] อาร์เรย์และได้รับคำสั่งตามลำดับตามลำดับของพวกเขาใน URL$this -> param[0] สอดคล้องกับ {id} , $this -> param[1] สอดคล้องกับ {name} ฯลฯควรกำหนดวิธีการของคอนโทรลเลอร์ของเส้นทางที่กำหนดเองดังนี้:
class HomeController extends WebController {
public function CustomRouteAction ( $ id , $ name , $ language = ' default ' ){
/* controller's method code here */
}
} หมายเหตุ ในตัวอย่างข้างต้น: {language?} เป็นพารามิเตอร์ทางเลือกพารามิเตอร์ทางเลือกควรมี '?' ในตอนท้ายของชื่อของพวกเขาและควรมีค่าเริ่มต้นในวิธีการของคอนโทรลเลอร์มิฉะนั้นหากพารามิเตอร์หายไปโปรแกรมจะแสดงผล 404: Not Found ข้อความเนื่องจากไม่มีการกำหนดพารามิเตอร์และไม่มีค่าเริ่มต้น
เมื่อตั้งค่าเส้นทางที่กำหนดเองคุณสามารถใส่พารามิเตอร์ตัวแปรใน route เป้าหมาย controller หรือ action เพื่อสร้างเส้นทางที่กำหนดเองทั่วไป
ตัวอย่าง:
Route:: get ( ' custom/{var_controller}/pattern/{action}/{param1} ' , ' Web ' , ' {var_controller} ' , ' {action} ' ); URL ใด ๆ ที่ตรงกับ custom/{var_controller}/pattern/{action}/{param1}
จะถูกกำหนดเส้นทางไปยัง: เส้นทาง: Web , คอนโทรลเลอร์: {var_controller} , การกระทำ: {action} และ params จะไม่รวมทั้ง {var_controller} หรือ {action} เพราะพวกเขาถูกใช้ในการกำหนดเส้นทาง
ดังนั้นหากคำขอด้วย url = custom / Account / pattern / View / sherifabdlnaby มามันจะถูกกำหนดเส้นทางไปที่: เส้นทาง: Web , คอนโทรลเลอร์: Account , การกระทำ: View และ params [0] = ' sherifabdlnaby '
คอนโทรลเลอร์มีหน้าที่รับผิดชอบในการประมวลผลคำขอของผู้ใช้และส่งคืนผลลัพธ์สำหรับผู้ใช้ไม่ว่าจะเป็น HTML สำหรับ WebControllers หรือ JsonResult สำหรับ ApiControllers หรือเปลี่ยนเส้นทางไปยังปลายทางอื่น
ไดเรกทอรีคอนโทรลเลอร์ควรตรงกับเนมสเปซของคอนโทรลเลอร์และควรเป็นดังนี้ Controllers{route}{ControllerName}Controller.php และใช้ AppControllers{route} โดยที่ {route} เป็นเส้นทางที่ตัวควบคุมนี้เป็นของ
+---Controllers
| +---Api <-- Api route dir.
| | HomeController.php <-- Home Controller for API route.
| |
| ---Web <-- Web (Default) route dir.
| AccountController.php
| HomeController.php <-- Home Controller for Web default route.
คอนโทรลเลอร์มี 4 ตัวแปรป้องกันที่ใช้:
$ params ; // array() that holds method's params
$ model ; // controller's model
$ data ; // the $data array() is what is passed to the controller's view.
$ meta ; // the $meta array() is what is passed to $layout meta section (for WebControllers Only)ผลลัพธ์ของคอนโทรลเลอร์ (และสิ่งที่ผู้ใช้เห็น) คือสิ่งที่ ส่งคืน ผ่าน
คอนโทรลเลอร์ใน CIRO มีฟังก์ชั่นต่าง ๆ ที่จะใช้เมื่อส่งคืนเอาต์พุตภายในคอนโทรลเลอร์เพื่อบรรเทางานเหล่านี้
การเรนเดอร์จะทำให้หน้าเว็บ HTML โดยใช้เลย์เอาต์เค้าโครงประกอบด้วยส่วนหัวส่วนข้อมูลเมตาการแจ้งเตือนร่างกายและส่วนท้าย ส่วนร่างกายของเค้าโครงถูกกำหนดตามวิธีการดูของคอนโทรลเลอร์
มุมมองของคอนโทรลเลอร์ใช้อาร์เรย์ $ [] เพื่อแสดงองค์ประกอบและส่วนข้อมูลเมตาใช้อาร์เรย์ $ meta []
render ( $ layout = null , $ viewPath = null , & $ data = null , & $ meta = null );| อาร์ก | คำอธิบาย | ค่าเริ่มต้น-ค่า |
|---|---|---|
$layout | ระบุเค้าโครงมุมมองที่ใช้ในการแสดงผล | เค้าโครงเริ่มต้นที่ระบุใน config.php |
$viewPath | ระบุเส้นทางสำหรับมุมมองที่จะแสดงผล | ดูกำหนดตามชื่อวิธีของคอนโทรลเลอร์ |
$data | มุมมอง $data Array () จะมีการเข้าถึงด้วย | อาร์เรย์ $data ของคอนโทรลเลอร์ () |
$meta | เค้าโครง $meta array () จะมีการเข้าถึงด้วย | $meta array ของคอนโทรลเลอร์ () |
ส่งคืน $this->render(); หากไม่มีอาร์กิวเมนต์ที่กำหนด (โดยใช้ค่าเริ่มต้น) จะเพียงพอใน 90% ของกรณี
การใช้งานขั้นพื้นฐานของ $ this -> render ();
class AccountController extends WebController {
public function View ( $ username ){
$ this -> data [ ' name ' ] = $ username ;
return $ this -> render ();
}
}RenderLelERROR และ RENDERLLMESSAGE จะแสดงหน้าข้อความ/ข้อผิดพลาดที่กำหนดเอง หากรหัสสถานะได้รับในพารามิเตอร์ที่ 2 คอนโทรลเลอร์จะส่งส่วนหัวรหัสสถานะ HTTP ที่สอดคล้องกันและแสดงผลมุมมองของรหัสนี้
function renderFullError( $ message , $ statusCode = null , $ layout = null );
function renderFullMessage( $ message , $ statusCode = null , $ layout = null );| อาร์ก | คำอธิบาย | ค่าเริ่มต้น-ค่า |
|---|---|---|
$message | ข้อความที่จะแสดงผลในมุมมอง | ไม่มี (ฟิลด์ที่จำเป็น) |
$statusCode | รหัสสถานะ http | โมฆะ |
$layout | ระบุเค้าโครงมุมมองที่ใช้ในการแสดงผล | เค้าโครงเริ่มต้นที่ระบุใน config.php |
การใช้งานขั้นพื้นฐานของ $ this -> renderlerror () / renderlmessage ();
class AccountController extends WebController {
public function View ( $ username ){
if ( /* User Found */ )
return $ this -> render ();
else
return $ this -> renderFullError ( ' User not found! ' , 404 );
}
}หากมีข้อยกเว้นใด ๆ ในระหว่างการดำเนินการสคริปต์เฟรมเวิร์กจะแสดงผลข้อผิดพลาดที่กำหนดเองเซิร์ฟเวอร์ภายใน 500
เมื่อส่งคืน $ this -> return () จากไม่มีการส่งเอาต์พุตของคอนโทรลเลอร์ไปยังผู้ใช้ แต่ผู้ใช้จะถูกเปลี่ยนเส้นทางไปยัง URL ที่กำหนด
function redirect( $ path );| อาร์ก | คำอธิบาย | ค่าเริ่มต้น-ค่า |
|---|---|---|
| $ PATH | เส้นทาง Relative หรือ Full ที่จะเปลี่ยนเส้นทางไปยัง | ไม่มี (ฟิลด์ที่จำเป็น) |
การใช้งานขั้นพื้นฐานของ $ this -> redirect ();
class AccountController extends WebController {
public function Login ( $ username , $ password ){
if ( /* Login Success */ )
return $ this -> redirect ( ' / ' ); // redirect to homepage.
else
return $ this -> renderFullMessage ( ' Incorrect Username or Password ' , 401 );
}
}ตรวจสอบว่าผู้ใช้อยู่/ไม่ลงชื่อเข้าใช้เปลี่ยนเส้นทางไปยังหน้าแรก/เข้าสู่ระบบหากไม่
ฟังก์ชั่นเหล่านี้ไม่ได้ใช้โดยคำสั่ง Return แต่จะหยุดสคริปต์หากพวกเขากำลังเปลี่ยนเส้นทางผู้ใช้ซึ่งหมายความว่ารหัสใด ๆ ด้านล่างฟังก์ชั่นนี้จะไม่ถูกดำเนินการหากการตรวจสอบของพวกเขาเป็นเท็จ
function verifyLoggedIn();
function verifyNotLoggedIn();การใช้งานขั้นพื้นฐานของ $ this -> VerifyloggedIn () / VerifynotLoggedIn ();
class AccountController extends WebController {
public function Login ( $ username , $ password ){
$ this -> verifyNotLoggedIn (); //Redirects to Homepage if user is already logged in.
if ( /* Login Success */ )
return $ this -> redirect ( ' / ' );
else
return $ this -> renderFullMessage ( ' Incorrect Username or Password ' , 401 );
}
} คลาสเซสชันเป็นคลาสที่ขยายได้ซึ่งจะจัดการการใช้งานของ $ _ SESSION ในโปรแกรมเพื่อบังคับใช้หลักการความรับผิดชอบเดี่ยว
/* Save Parameters to $_SESSION, use for Login */
public static function saveLoginSession( $ _id , $ username );
/* Return TRUE if user is logged On */
public static function isLoggedIn ();
/* Unset and Destroy current Session, use for logout */
public static function destroyLoginSession ();
/* Add Error Alerts to be rendered to user when controller's $this -> render() is called */
public static function addErrorAlert ( $ errorAlert );
/* Add Warning Alerts to be rendered to user when controller's $this -> render() is called */
public static function addWarningAlert ( $ warningAlert );
/* Add info Alerts to be rendered to user when controller's $this -> render() is called */
public static function addInfoAlert ( $ infoAlert );
/* Add success Alerts to be rendered to user when controller's $this -> render() is called */
public static function addSuccessAlert ( $ successAlert );การแจ้งเตือนคือข้อความแฟลชที่บันทึกไว้ในเซสชันของผู้ใช้การแจ้งเตือนสามารถแสดงต่อผู้ใช้ได้โดยการแสดงผลเป็น HTML หรือเข้ารหัสใน JSON ในกรณีของ API
การแจ้งเตือนสามารถใช้เพื่อแสดงข้อผิดพลาดเกี่ยวกับการตรวจสอบแบบฟอร์มหรือข้อความหากกระบวนการสำเร็จหรือล้มเหลว
การแจ้งเตือนมีส่วนของตัวเองในรูปแบบใด ๆ คอนโทรลเลอร์ -> ฟังก์ชั่น render () จะทำให้การแจ้งเตือนใด ๆ ที่เก็บไว้ในเซสชันผู้ใช้
มีการแจ้งเตือน 4 ประเภท:

เค้าโครงคือโครงสร้างของหน้าเว็บ HTML ประกอบด้วย 5 ส่วน
| ส่วน | คำอธิบาย |
|---|---|
| เมตา | ส่วนนี้แสดงแท็กข้อมูลเมตา HTML สำหรับชื่อชื่อ DESC และ SEO แท็ก ข้อมูลเมตาผ่านและเติมเต็มโดยคอนโทรลเลอร์และสามารถเข้าถึงได้ในอาร์เรย์ $ meta () |
| ส่วนหัว | ส่วนนี้ทำให้ส่วนหัวของหน้า |
| การแจ้งเตือน | ส่วนนี้แสดงการแจ้งเตือนที่เก็บไว้ในเซสชันของผู้ใช้หากมี |
| เนื้อหา | ส่วนนี้แสดงผลส่วนหลักของหน้าและมีข้อมูลผ่านและกรอกข้อมูลโดยคอนโทรลเลอร์ |
| ส่วนท้าย | ส่วนนี้ทำให้ส่วนท้ายของหน้า |
+---Views
| ---_Layouts
| ---default <-- Layout root directory.
| | | footer.html
| | | header.html
| | | layout.html
| | | meta.html
| | ---alerts <-- alerts directory.
| | errors.html
| | infos.html
| | successes.html
| | warnings.html
| ---anotherLayout
layout.html เป็นไฟล์สุดท้ายที่แสดงผลเมื่อแสดงเค้าโครงมันเป็นโครงสร้างที่ผ่านไปซึ่ง ฯลฯ และ CSS/js ใด ๆ ที่ใช้ในเลย์เอาต์นี้จะต้องรวมอยู่ใน layout.html เช่น bootstrap CSS และ JS
<!DOCTYPE html >
< html lang =" en " >
< head >
< ?= $data['meta'] ? >
< link rel =" stylesheet " href =" /bootstrap/css/bootstrap.min.css " >
</ head >
< body >
< ?= $data['header'] ? >
< ?= $data['alerts'] ? >
< ?= $data['content'] ? >
< ?= $data['footer'] ? >
< script src =" /bootstrap/js/bootstrap.min.js " > </ script >
</ body >
</ html > 
มุมมองคือผลลัพธ์ของการกระทำของคอนโทรลเลอร์เว็บมุมมองมีอาร์เรย์ $ Data Assoc ซึ่งส่งผ่านโดยคอนโทรลเลอร์มันถูกใช้เพื่อส่งผ่านข้อมูลระหว่างคอนโทรลเลอร์และมุมมอง ตำแหน่งมุมมองจะต้องตรงกับโครงสร้างของคอนโทรลเลอร์/โครงสร้างเนมสเปซ
View การดำเนินการของ Account Controller ในเส้นทาง Web +---Controllers
| +---Api
| | HomeController.php
| |
| ---Web
| AccountController.php <-- Account Controller of Web route in ControllersWeb
| HomeController.php
|
+---Views
| +---Web
| | +---Account <-- Account Controller View Dir in ControllerWebAccount
| | | Index.html
| | | Login.html
| | | Register.html
| | | View.html <-- The View for action 'View', of 'Account Controller' in the 'Web' Route
| | |
| | ---Home
| | About.html
| | Index.html
Config/config.phpคลาสผู้ช่วยฐานข้อมูลใช้เพื่อรับอินสแตนซ์ซิงเกิลตันสำหรับการเชื่อมต่อฐานข้อมูลซึ่งข้อมูลรับรองการเชื่อมต่อจะจัดเก็บในไฟล์กำหนดค่า
| ระดับ | ส่วนขยาย | คำอธิบาย |
|---|---|---|
| DBPDO | PDO | คลาส Singleton สำหรับส่วนขยาย PDO DB สามารถใช้ PDO เพื่อเชื่อมต่อกับ RDBMS ต่างๆเช่น MySQL, Mariadb หรือ PostgreSQL, การเชื่อมต่อข้อมูลรับรองที่ตั้งค่าไว้ที่ Configpdo.php และเปิดใช้งานที่ Config/config.php |
| DBSQL | Mysqli | คลาส Singleton สำหรับส่วนขยาย mysqli, ข้อมูลรับรองการเชื่อมต่อสำหรับ mysql ตั้งค่าที่ Configmysqli.php และเปิดใช้งานที่ Config/config.php |
| DBMongo | mongodb โดยใช้ MongoDB PHP Library (Php 7.0+) | คลาส Singleton สำหรับการเชื่อมต่อของ MongoDB PHP Library ที่สร้างขึ้นรอบ ๆ ส่วนขยาย mongodb ระดับต่ำข้อมูลประจำตัวจะถูกเก็บไว้ที่ Configmongo.php และเปิดใช้งานที่ Config/config.php |
mongodb และ MongoDB PHP Library ซึ่งทั้งคู่ต้องการ Php 7.0+ composer require mongodb/mongodbCIRO PHP Framework อยู่ภายใต้ใบอนุญาต MIT คุณสามารถดูใบอนุญาตได้ที่นี่