
CIRO是一个快速启动项目的MVC PHP框架,其设计为简单,可配置,模块化,脱钩,可扩展和轻巧,以使其更容易构建更好,易于维护的PHP代码。
开箱即用的Ciro随附:
CIRO带有一个模板项目,其中一个简单的身份验证系统可以为您的项目或原型开发开发。
框架模板项目的在线示例:https://ciro-framework.herokuapp.com
C:xampphtdocs用于Windows或/Applications/XAMPP/xamppfiles/htdocs 。httpd.conf目录root配置为CIRO的目录,请参见说明:此处。要使用预制的登录/寄存器,并且您使用的是SQL (不是Mongo),必须在SQL中创建数据库和表。
http://localhost/phpmyadmin ,然后在根目录中存在的sql_database_script.sql中执行查询。要使用预制的登录/寄存器,并且您想使用MongoDB ,必须使用Composer安装mongodb extension和MongoDB PHP Library ,请在此处说明。还可以用Models.disabled.mongo.userrepository.class.php替换Models/UserRepository.php 。
Mysqli版本。PDO版本。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解析为命名空间controllers/{route}中控制器{controller}的方法{action} ,因此在PHP OOP符号中对应于:
App Controllers { route }{controller} -> { action }在配置Config/config.php中,您可以指定一个“ default_route”,因此,如果URL不包含路由,则该程序将根据默认路由路由。默认情况下,“ default_route”为“ Web”。因此,使用默认路由的典型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} ,则将路由到'config/config.php'指定的'default_action'的程序。
如果URL未指定{controller} ,则将路由到'config/config.php'中指定的'default_controller'的程序。
要添加新路由并使用默认路由访问它,必须将其添加到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]在上面的URL中保留{param1}的值。
访问控制器方法中参数的另一种方法是将参数添加到控制器的方法本身中。使用上面的同一示例,如果像这样定义了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动词( 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 ' );与custom/route/{id}/{name}/{language?}匹配的任何URL将被路由到:路由: 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} ' );匹配custom/{var_controller}/pattern/{action}/{param1}的任何URL
将被路由到:路由: Web , Controller: {var_controller} , action: {action}和params不包含{var_controller}和{action}因为它们是在路由中使用的。
因此,如果带有url的请求= custom / Account / tatter / View / sherifabdlnaby ,它将被路由到:路由: Web , controller: Account ,操作: View and params [0] =' sherifabdlnaby '
控制器负责处理用户请求并返回用户作为WebControllers的HTML的输出,或者用于ApiControllers的JSONRESULT,或重定向到另一个目的地。
控制器目录应匹配控制器的命名空间,并且应如下以下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网页,布局包含标头,元数据部分,警报,身体和页脚。布局的主体部分是根据控制器的方法ViewPath确定的。
控制器的视图使用$数据[]数组来呈现其元素,并且元数据部分使用$ META []数组。
render ( $ layout = null , $ viewPath = null , & $ data = null , & $ meta = null );| arg | 描述 | 默认值 |
|---|---|---|
$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 ();
}
}RenderFullerror和RenderFullMessage将渲染自定义消息/错误页面。如果在第二个参数中给出了状态代码,则控制器会发送相应的HTTP状态代码标头并渲染该代码的视图。
function renderFullError( $ message , $ statusCode = null , $ layout = null );
function renderFullMessage( $ message , $ statusCode = null , $ layout = null );| arg | 描述 | 默认值 |
|---|---|---|
$message | 视图中要渲染的消息。 | 无(必需字段) |
$statusCode | HTTP状态代码 | 无效的 |
$layout | 指定用于渲染的视图布局 | config.php中指定的默认布局 |
$ this-> renderfullerror() / 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 );
}
}检查用户是否登录,如果不是,请重定向到主页/登录。
这些函数不会由返回语句使用,但是,如果它们重定向用户,则可以停止脚本,这意味着如果其验证为false,则该函数以下的任何代码都不会执行;
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或在API的JSON案例中对用户显示警报。
警报可用于显示有关表单验证的错误,或者如果过程成功或失败,则可以显示消息。
警报在任何布局中都有自己的部分,控制器 - > Render()函数将渲染用户会话中存储的任何警报。
有4种警报类型:

布局是HTML网页的结构,由5个部分组成
| 部分 | 描述 |
|---|---|
| 元 | 本节将HTML元数据标签呈现为标题,DESC和SEO标签。元数据通过控制器并填充,可以在$ META ARRAY()中访问 |
| 标题 | 本节渲染页面标题 |
| 警报 | 本节呈现在用户会话中存储的警报,如果有 |
| 内容 | 本节呈现页面的主要部分,并通过控制器传递并填写其数据 |
| 页脚 | 本节渲染页面页脚 |
+---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 > 
视图是Web控制器操作的输出,一个视图具有由控制器传递的$数据关联数组,用于传递控制器和视图之间的数据。视图位置必须匹配控制器路径/名称空间结构。
Web路由中的Account Controller的动作View示例 +---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 | PDO DB扩展程序的单例类,PDO可用于连接到MySQL,MariadB或PostgreSQL等各种RDBMS,在Configpdo.php上设置的连接凭据,并在Config/config.php上启用 |
| DBSQL | Mysqli | MySQLI扩展程序的单例类,在Configmysqli.php上设置的mySQL的连接凭据,并在Config/config.php上启用 |
| dbmongo | mongodb使用MongoDB PHP Library (PHP 7.0+) | 用于围绕低级mongodb扩展而构建的MongoDB PHP库连接的Singleton类,凭据存储在Configmongo.php上,并在Config/config.php上启用 |
mongodb扩展名和MongoDB PHP Library ,这两者都需要PHP 7.0+ composer require mongodb/mongodbCIRO PHP框架属于MIT许可证,您可以在此处查看许可证。