
CIRO هو إطار MVC PHP لبدء المشاريع بسرعة ، وهو مصمم ليكون بسيطًا ، قابل للتكوين ، معياري ، مفصل ، قابل للتمديد وخفيف الوزن لتسهيل بناء رمز PHP أفضل وسهلة الحفاظ عليه.
خارج الصندوق يأتي Ciro مع:
يأتي CIRO مع مشروع قالب مع نظام مصادقة بسيط لبدء تطوير المشروع أو النموذج الأولي.
مثال عبر الإنترنت لمشروع قالب الإطار: https://ciro-framework.herokuapp.com
C:xampphtdocs لنظام التشغيل Windows أو /Applications/XAMPP/xamppfiles/htdocs لنظام التشغيل Mac.httpd.conf من دليل 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 لـ MySQL.PDO لـ PDO المدعوم من RDBMS (S).MongoDB (PHP 7.0+).جميع القابلة للتكوين عبر ملفات التكوين.

يتبع بنية المشروع مواصفات 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} of Controller {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
يمكن الوصول إلى params داخل طريقة وحدة التحكم عبر $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 .
يمكنك تحديد مسار مخصص لكل REST HTTP VERB EG ( 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 Controller: Home Action: 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 لأنه لم يتم إعطاء بارام اختياري وليس له قيمة افتراضية.
عند إعداد مسار مخصص ، يمكنك وضع param متغير في 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} ولن يتضمن المعاملات {var_controller} أو {action} لأنها تم استخدامها في التوجيه.
لذا ، إذا كان هناك طلب مع url = custom / Account / pattern / View / sherifabdlnaby ، فسيتم توجيهه إلى: المسار: Web ، وحدة التحكم: Account ، الإجراء: View و parms [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 على وظائف مختلفة لاستخدامها عند إرجاع الإخراج داخل وحدات التحكم لتخفيف هذه المهام.
ستقوم Render بتقديم صفحة ويب HTML باستخدام تخطيط ، ويحتوي التصميم على رأس وقسم بيانات تعريف وتنبيهات وجسم وتذييل. يتم تحديد قسم الجسم من التصميم وفقًا لـ ViewPath طريقة وحدة التحكم.
تستخدم طريقة عرض وحدة التحكم صفيف بيانات $ [] لتقديم عناصرها ، ويستخدم قسم البيانات الوصفية صفيف $ meta [].
render ( $ layout = null , $ viewPath = null , & $ data = null , & $ meta = null );| arg | وصف | القيمة الافتراضية |
|---|---|---|
$layout | يحدد تصميم العرض المستخدم لتقديمه | التصميم الافتراضي المحدد في config.php |
$viewPath | يحدد المسار لعرض العرض | العرض المحدد وفقًا لاسم طريقة وحدة التحكم |
$data | سيكون عرض $data Array () وصول أيضًا | مجموعة $data () |
$meta | سيكون لتصميم $meta array () وصول أيضًا | جهاز التحكم الخاص بـ $meta $ () |
إرجاع $this->render(); بدون أي وسيطات معينة (باستخدام القيم الافتراضية) ستكون كافية في 90 ٪ من الحالات.
الاستخدام الأساسي لـ $ this -> render () ؛
class AccountController extends WebController {
public function View ( $ username ){
$ this -> data [ ' name ' ] = $ username ;
return $ this -> render ();
}
}ستقدم Renderfullerror و stenderfullMessage صفحة رسالة/خطأ مخصصة. إذا تم إعطاء رمز الحالة في المعلمة الثانية ، فإن وحدة التحكم ترسل رأس رمز حالة HTTP المقابل ويجعل طريقة عرض هذا الرمز.
function renderFullError( $ message , $ statusCode = null , $ layout = null );
function renderFullMessage( $ message , $ statusCode = null , $ layout = null );| arg | وصف | القيمة الافتراضية |
|---|---|---|
$message | رسالة ليتم تقديمها في العرض. | لا شيء (الحقل المطلوب) |
$statusCode | رمز حالة HTTP | باطل |
$layout | يحدد تصميم العرض المستخدم لتقديمه | التصميم الافتراضي المحدد في config.php |
الاستخدام الأساسي لـ $ this -> reductfullerror () / renderfullMessage () ؛
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 );| arg | وصف | القيمة الافتراضية |
|---|---|---|
| مسار $ | مسار 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 );
}
}تحقق مما إذا كان المستخدم/لم يتم تسجيل الدخول ، إعادة توجيه إلى الصفحة الرئيسية/تسجيل الدخول إذا لم يكن.
لا يتم استخدام هذه الوظائف عن طريق بيان الإرجاع ، ومع ذلك فإنها تتوقف عن البرنامج النصي إذا كانت تعيد توجيه المستخدم ، مما يعني أنه لن يتم تنفيذ أي رمز أسفل هذه الوظائف إذا كان التحقق من صحةهم خطأ ؛
function verifyLoggedIn();
function verifyNotLoggedIn();الاستخدام الأساسي لـ $ هذا -> 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 in-case من واجهة برمجة التطبيقات.
يمكن استخدام التنبيهات لإظهار أخطاء حول التحقق من صحة النموذج ، أو رسالة إذا نجحت عملية أو فشلت.
تنبيهات لها قسم خاص بها في أي تخطيط ، فإن وظيفة وحدة التحكم -> 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
التصميم. html هو الملف النهائي الذي يتم تقديمه عند تقديم التصميم ، وهو هيكله الذي يجب أن يتم تضمينه ، وما إلى ذلك وأي CSS/JS المستخدمة في هذا التصميم في التخطيط. html مثل bootstrap cs و 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 .يتم استخدام فئات مساعد قاعدة البيانات للحصول على مثيل Singleton لاتصالات قاعدة البيانات ، حيث يتم تخزين بيانات اعتماد الاتصال في ملفات التكوين.
| فصل | امتداد | وصف |
|---|---|---|
| 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 مبنية حول امتداد mongodb منخفضة المستوى ، يتم تخزين بيانات الاعتماد على Configmongo.php وتمكينها في Config/config.php |
mongodb ومكتبة MongoDB PHP Library ، والتي تتطلب كلاهما PHP 7.0+ composer require mongodb/mongodbيخضع CIRO PHP Framework تحت رخصة معهد ماساتشوستس للتكنولوجيا ، يمكنك عرض الترخيص هنا.