
CIRO - это MVC PHP -структура для быстрого KickStart Projects, он предназначен для того, чтобы быть простым, настраиваемым, модульным, отделенным, расширяемым и легким, чтобы упростить строительство лучшего и легко поддерживаемого кода PHP.
Из коробки Ciro поставляется:
CIRO поставляется с шаблонным проектом с простой системой аутентификации, чтобы начать разработку для вашего проекта или прототипа.
Онлайн-пример проекта шаблона фреймворка: https://ciro-framework.herokuapp.com
C:xampphtdocs для Windows или /Applications/XAMPP/xamppfiles/htdocs для Mac.httpd.conf от hattpd.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 для поддержки RDBM (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} контроллера {controller} в controllers/{route} , поэтому в PHP oop нотация соответствует:
App Controllers { route }{controller} -> { action } В Configuration 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} , программа для маршрута на «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 -глагола, например ( 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 ();Пользовательские маршруты определены в /конфиг /routes.php .
Route:: get ( ' custom/route/{id}/{name}/{language?} ' , ' Web ' , ' Home ' , ' CustomRouteAction ' ); Любой URL, который соответствует custom/route/{id}/{name}/{language?} Будет маршрутизирован по адресу: route: 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 сообщение, поскольку необязательный парамет не был указан и не имеет значения по умолчанию.
При настройке пользовательского маршрута вы можете поместить переменную в целевом route , controller или action для создания более «общего» пользовательского маршрута.
Пример:
Route:: get ( ' custom/{var_controller}/pattern/{action}/{param1} ' , ' Web ' , ' {var_controller} ' , ' {action} ' ); Любой URL, который соответствует custom/{var_controller}/pattern/{action}/{param1}
будет маршрутизирован по адресу: route: Web , controller: {var_controller} , action: {action} и params не будет включать ни {var_controller} , ни {action} потому что они использовались в маршрутизации.
Поэтому, если запрос с url = custom / Account / pattern / View / sherifabdlnaby придет, он будет маршрутизирован: route: Web , controller: Account , action: 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 имеют различные функции для использования при возврате выходных контроллеров для облегчения этих задач.
Render будет отображать веб -страницу HTML с использованием макета, макет содержит заголовок, раздел метаданных, оповещения, тело и нижний колонтитул. Раздел тела макета определяется в соответствии с методом контроллера.
В представлении контроллера используется массив данных $ Data [] для отображения своих элементов, а в разделе метаданных используется массив $ meta [].
render ( $ layout = null , $ viewPath = null , & $ data = null , & $ meta = null );| Арг | Описание | По умолчанию |
|---|---|---|
$layout | Указывает макет представления, используемый для рендеринга | Макет по умолчанию, указанный в config.php |
$viewPath | Указывает путь для вида | Просмотр определен в соответствии с имени метода контроллера |
$data | Представление $data Array () тоже будет иметь доступ | Собственный массив $data контроллера () |
$meta | Макет $meta Array () тоже будет иметь доступ | Собственный массив $meta Controller () |
return $this->render(); Без каких -либо заданных аргументов (использования значений по умолчанию) будет достаточно в 90% случаев.
Основное использование $ this -> render ();
class AccountController extends WebController {
public function View ( $ username ){
$ this -> data [ ' name ' ] = $ username ;
return $ this -> render ();
}
}RenderFulLerror и renderFullMessage будут отображать страницу пользовательского сообщения/ошибки. Если код состояния приведен во 2 -м параметре, контроллер отправляет соответствующий заголовок кода состояния HTTP и отображает представление этого кода.
function renderFullError( $ message , $ statusCode = null , $ layout = null );
function renderFullMessage( $ message , $ statusCode = null , $ layout = null );| Арг | Описание | По умолчанию |
|---|---|---|
$message | Сообщение, которое должно быть представлено в представлении. | Нет (обязательное поле) |
$statusCode | Http code | нулевой |
$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 );
}
}Если какое -либо исключение было поднято во время выполнения скрипта, Framework будет отображать пользовательскую страницу ошибки внутреннего сервера.
При возврате $ 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 );
}
}Проверьте, является ли пользователь/не вошел в систему, перенаправить на домашнюю страницу/вход, если нет.
Эти функции не используются оператором возврата, однако он останавливает скрипт, если они перенаправляют пользователя, что означает, что любой код ниже этих функций не будет выполнен, если их проверка неверно;
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.
Оповещения могут быть использованы для демонстрации ошибок в отношении проверки формы или сообщения, если процесс преуспел или не удался.
Оповещения имеют свой собственный раздел в любом макете, функция Controller -> 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, которые используются в этом макете, должны быть включены в макет.
<!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 может использоваться для подключения к различным RDBM, таким как 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 для подключения библиотеки PHP MongoDB, которая построена вокруг расширения mongodb низкого уровня, учетные данные хранятся в Configmongo.php и включены в Config/config.php |
mongodb и MongoDB PHP Library , которая требует PHP 7.0+ composer require mongodb/mongodbCiro Php Framework находится под лицензией MIT, вы можете просмотреть лицензию здесь.