Он считывает URL-маршрут и анализирует значения пути, поэтому его можно интерпретировать вручную или автоматически максимально быстрым способом (например, для реализации системы MVC).
В отличие от других библиотек, эта библиотека не имеет зависимостей и содержится в одном классе, поэтому она совместима с любым проектом PHP, например WordPress, Laravel, Drupal, пользовательским проектом PHP и т. д.
Эта библиотека основана на CoC Convention over Configuration . Это уменьшает шаблонность, но имеет фиксированные функциональные возможности. Эта библиотека не позволяет использовать собственные «маршруты», но она охватывает практически все случаи, поэтому повышает производительность и удобство использования, жертвуя при этом гибкостью.
Допустим, у нас есть следующий URL-адрес http://somedomain.dom/Customer/Update/2. Эта библиотека преобразует этот URL-адрес в переменные, которые можно обрабатывать или напрямую вызывать метод.
маршрут.php
$ route = new RouteOne ( ' http://www.somedomain.dom ' );
$ route -> addPath ( ' api/{controller}/{action}/{id} ' );
$ route -> addPath ( ' {controller}/{action}/{id}/{idparent} ' );
$ route -> fetchPath ();
$ this -> callObjectEx ( ' cocacolacontroller{controller}Controller ' );
класс контроллерCustomerController.php
namespace cocacola controller ;
class CustomerController {
public function updateAction ( $ id = null , $ idparent = null , $ event = null ) {
echo " We want to update the customer $ id " ;
}
}
Допустим, мы делаем следующую операцию:
Пользователь вызывает следующий веб-сайт http://somedomain.com/Customer/Insert, он хочет показать форму для вставки клиента.
use eftec RouteOne RouteOne ;
$ route = new RouteOne ( ' . ' , null , null ); // Create the RouteOne Class
$ route -> fetch (); // fetch all the input values (from the route, get, post and such).
$ route -> callObject ( ' somenamespace \ controller \ %sController ' ); // where it will call the class CustomerController*
или
use eftec RouteOne RouteOne ;
$ route = new RouteOne ( ' . ' , null , null ); // Create the RouteOne Class
$ route -> fetch (); // fetch all the input values (from the route, get, post and such).
$ route -> callObjectEx ( ' somenamespace \ controller \ {controller}Controller ' ); // where it will call the class CustomerController*
Этот код вызывает метод InsertActionGet (GET), InsertActionPost (POST) или InsertAction (GET/POST) внутри класса Customer.
Вызываемый метод записывается следующим образом:
class Customer {
public function insertAction ( $ id = "" , $ idparent = "" , $ event = "" ) {
// here we do our operation.
}
}
Предположим, мы хотим обновить номер клиента 20 , затем мы можем перейти на следующую страницу.
http://somedomain.com/Customer/Update/20
где 20 — это «$id» клиента, которого нужно отредактировать (это может быть номер строки)
А что, если мы хотим обновить Клиента номер 20 в бизнес -приложении?
http://somedomain.com/Customer/Update/20/APPL
Где APPL является идентификатором родителя
Теперь предположим, что мы нажимаем на какую-то кнопку или выполняем какое-то действие. Его можно захватить полем _event и прочитать аргументом $event . Эту переменную можно отправить через GET или POST.
http://somedomain.com/Customer/Update/20/APPL?_event=click
Примечание. Модули получаются автоматически, если вы используете addPath() и fetchPath(), поэтому вам не нужно их указывать. Теперь предположим, что наша система модульная, и у нас есть несколько клиентов (внутренние клиенты, внешние и т.д.)
$ route = new RouteOne ( ' . ' , null , true ); // true indicates it is modular.
или
$ route = new RouteOne ( ' . ' , null ,[ ' Internal ' ]); // or we determine the module automatically. In this case, every url that starts with Internal
затем
$ route -> fetch ();
$ route -> callObject ( ' somenamespace \ %2s% \ controller \ %1sController ' );
http://somedomain.com/Internal/Customer/Update/20/APPL?_event=click
Затем первое ветвление — это имя модуля ( Internal ), которое вызывает класс somenamespaceInternalcontrollerCustomerController.
композитору требуется eftec/ RouteOne
Линукс:
vendor/bin/ RouteOne cli -init (if the binary does not work, then chage the permission to execution)
Окна:
. v endor b in r outeonecli.bat -init
Будет создан файл .htaccess, а файлы Route.php и Route.php будут иметь конфигурацию по умолчанию.
const BASEURL = " http://localhost " ; // Base url edit this value.
const BASEWEBNS = " eftec \ controller " ; // Base namespace (web) edit this value
const BASEAPINS = " eftec \ api " ; // Base namespace (api) edit this value
Позже вы сможете добавить или отредактировать код в этом файле.
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
DirectoryIndex route.php
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Send Requests To Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ route.php?req=$1 [L,QSA]
</IfModule>
Если ваш веб-хостинг не поддерживает опцию FollowSymlinks, попробуйте заменить ее на Options +SymLinksIfOwnerMatch.
Важная строка:
RewriteRule ^(.*)$route.php?req=$1 [L,QSA] # Маршрутизатор, к которому осуществляется вызов.
server {
listen 80;
server_name localhost;
root /example.com/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.html index.htm index.php;
charset utf-8;
location / {
try_files $uri $uri/ /router.php?req=$document_uri&$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ .php$ {
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /.(?!well-known).* {
deny all;
}
}
Важная строка:
try_files $uri $uri/ /router.php?req=$document_uri&$query_string;
server {
listen 80;
server_name localhost;
root c:/www;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.html index.htm index.php;
charset utf-8;
location / {
try_files $uri $uri/ /router.php?req=$document_uri&$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /.(?!well-known).* {
deny all;
}
}
Важная строка:
try_files $uri $uri/ /router.php?req=$document_uri&$query_string;
где router.php — файл, который будет работать как маршрутизатор. ?req=$1 важен, потому что система будет читать маршрут из «req».
// router.php
$ route = new RouteOne (); // Create the RouteOne Class
$ route -> fetch (); // fetch all the input values (from the route, get, post and such).
$ route -> callObject ( ' somenamespace \ controller \ %sController ' ); // where it will call the class somenamespacecontrollerCustomerController
Примечание:
Если вы хотите использовать аргумент, отличный от «req», вы можете изменить его, используя следующий код:
$route->argumentName='newargument';
Начиная с версии 1.21 можно использовать собственный путь вместо заранее определенного пути. Это рекомендуемый способ. Другой метод все еще существует.
Синтаксис:
очиститьПуть()
Он очищает все определенные пути
Синтаксис:
addPath($path, $name = null, вызываемый $middleWare=null)
Он добавляет пути, которые можно оценить с помощью fetchPath().
Пример:
$ this -> addPath ( ' api/{controller}/{action}/{id:0} ' , ' apipath ' );
$ this -> addPath ( ' /api/{controller}/{action}/{id:0}/ ' , ' apipath ' ); // "/" at the beginner and end are trimmed.
$ this -> addPath ( ' {controller}/{action}/{id:0} ' , ' webpath ' );
$ this -> addPath ( ' {controller:root}/{action}/{id:0} ' , ' webpath ' ); // root path using default
$ this -> addPath ( ' somepath ' , ' namepath ' ,
function ( callable $ next , $ id = null , $ idparent = null , $ event = null ) {
echo " middleware n" ;
$ result = $ next ( $ id , $ idparent , $ event ); // calling the controller
echo " endmiddleware n" ;
return $ result ;
});
Примечание:
Первая часть пути перед знаком "{" используется для определения того, какой путь будет использоваться.
Пример «путь/{контроллер}» и «путь/{контроллер}/{id}», система будет считать, что это один и тот же путь.
строка параметра $path Путь, пример "aaa/{controller}/{action:default}/{id}"
Где default — это необязательное значение по умолчанию.
строка параметра |null $name (необязательно), имя пути
параметр callable|null $middleWare Вызываемая функция, используемая для промежуточного программного обеспечения.
Первый аргумент функции должен быть вызываемым методом.
Следующие аргументы должны быть аргументами, определенными callObjectEx.
(идентификатор, идентификатор родителя, событие)
Путь может начинаться со статического местоположения, но остальная часть пути должна определяться переменными (заключенными в {}) и разделяться знаком "/".
Вы также можете установить значение по умолчанию для пути, написав «:» после имени переменной: {имя:значение по умолчанию}
Имя можно получить, используя $this->currentPath. Если добавить имя с таким же именем, то оно заменяется.
Если вы не задаете имя, оно использует автонумерацию.
Имя также возвращается при вызове $this->fetchPath().
Пример:
$ this -> addPath ( ' {controller}/{id}/{idparent} ' );
$ this -> addPath ( ' myapi/otherfolder/{controller}/{id}/{idparent} ' );
$ this -> addPath ( ' {controller:defcontroller}/{action:defaction}/{id:1}/{idparent:2} ' );
// url: /dummy/10/20 =>(controller: dummy, id=10, idparent=20)
// url: /myapi/otherfolder/dummy/10/20 =>(controller: dummy, id=10, idparent=20)
Вы можете определить разные пути, однако будет использоваться только первая часть пути, соответствующая некоторому URL-адресу. «path/somepath/{id}» будет работать, «path/{id}/other» не будет работать
Синтаксис:
fetchPath()
Он извлекает путь, ранее определенный addPath, и возвращает имя (или номер) пути. Если не найден, то возвращается false
Пример:
$ route = new RouteOne ( ' http://www.example.dom ' );
$ route -> addPath ( ' {controller}/{id}/{idparent} ' , ' optionalname ' );
// if the url is : http://www.example.dom/customer/1/200 then it will return
echo $ route -> fetchPath (); // optionalname
echo $ route -> controller ; // customer
echo $ route -> id ; // 1
echo $ route -> idparent ; // 200
Он получает значение запроса (URL).
Примечание. Этот запрос не включает значения «req», «_event» и «_extra».
Пример:
// http://localhost/..../?id=hi
$ id = $ router -> getQuery ( " id " ); // hi
$ nf = $ router -> getQuery ( " something " , " not found " ); // not found
Он устанавливает значение запроса
Пример:
$ route -> setQuery ( " id " , " hi " );
$ id = $ router -> getQuery ( " id " ); // hi
Синтаксис:
fetchPath()
Получите значения из маршрута, и значения будут обработаны.
Синтаксис
callObjectEx($classStructure, $throwOnError, $method, $methodGet, $methodPost, $arguments, $injectArguments)
Он создает новый экземпляр объекта (например, объект Controller) и вызывает метод.
Примечание. Это расширенная версия метода::callObject().
Этот метод использует {} для замены значений на основе следующих переменных:
Ярлык | Описание |
---|---|
{контроллер} | Имя контроллера |
{действие} | Текущее действие |
{событие} | Текущее событие |
{тип} | Текущий тип пути (ws,controller,front,api) |
{модуль} | Текущий модуль (если модуль активен) |
{идентификатор} | Текущий идентификатор |
{idparent} | Текущий родительский идентификатор |
{категория} | Текущая категория |
{подкатегория} | Текущая подкатегория |
{подподкатегория} | Текущая подкатегория |
Пример:
// controller example http://somedomain/Customer/Insert/23
$ this -> callObjectEx ( ' cocacolacontroller{controller}Controller ' );
// it calls the method cocacolacontrollerCustomer::InsertAction(23,'','');
// front example: http://somedomain/product/coffee/nescafe/1
$ this -> callObjectEx ( ' cocacolacontroller{category}Controller ' // the class to call
, false // if error then it throw an error
, ' {subcategory} ' // the method to call (get, post or any other method)
, null // the method to call (method get)
, null // the method to call (method post)
,[ ' subsubcategory ' , ' id ' ] // the arguments to call the method
,[ ' arg1 ' , ' arg2 ' ]); // arguments that will be passed to the constructor of the instance
// it calls the method cocacolacontrollerproduct::coffee('nescafe','1');
Вызовите метод внутри объекта, используя текущий маршрут.
Пример:
Маршрутизатор:
$ databaseService = new SomeDatabaseService ();
$ route = new RouteOne ();
$ route -> callObjectEx ( ' cocacolacontroller{controller}Controller ' // the class to call
, false // if error then it throw an error
, ' {action}Action ' // the method to call (get, post or any other method)
, ' {action}Action{verb} ' // the method to call (method get)
, ' {action}Action{verb} ' // the method to call (method post)
,[ ' id ' , ' idparent ' , ' event ' ] // the arguments to call the method
,[ $ databaseService , $ route ]); // (optional)arguments that will be passed to the constructor of the instance
Контроллер:
namespace cocacola controller ;
class CustomerController {
protected $ databaseService ;
protected $ route ;
public function __construct ( $ databaseService , $ route ) {
// optional: injecting services
$ this -> databaseService = $ databaseService ;
$ this -> route = $ route ;
}
// any action GET or POST
public function GreenAction ( $ id = "" , $ idparent = "" , $ event = "" ) {
}
// GET only action (optional)
public function BlueActionGET ( $ id = "" , $ idparent = "" , $ event = "" ) {
// **my code goes here.**
}
// POST only action (optional)
public function YellowActionPOST ( $ id = "" , $ idparent = "" , $ event = "" ) {
// **my code goes here.**
}
// GET only action (optional)
public function RedActionGET ( $ id = "" , $ idparent = "" , $ event = "" ) {
// **my code goes here.**
}
// any action GET or POST
public function RedAction ( $ id = "" , $ idparent = "" , $ event = "" ) {
// **my code goes here.**
}
}
Результаты:
URL | метод под названием |
---|---|
http://localhost/Клиент/Зеленый (GET) | ЗеленыйДействие |
http://localhost/Customer/Green/20/30?_event=click (GET) | GreenAction($id=20, $idparent=30, $event='click') |
http://localhost/Клиент/Зеленый (POST) | ЗеленыйДействие |
http://localhost/Клиент/Синий (GET) | BlueActionGET |
http://localhost/Клиент/Синий (POST) | ОШИБКА |
http://localhost/Клиент/Желтый (GET) | ОШИБКА |
http://localhost/Клиент/Желтый (POST) | ЖелтыйДействиеPOST |
http://localhost/Клиент/Красный (GET) | RedActionGET (имеет приоритет над RedAction) |
http://localhost/Клиент/Красный (POST) | RedAction |
http://localhost/Клиент/Оранжевый | ОШИБКА |
Он вызывает (включает) файл php, используя текущее имя контроллера.
Синтаксис:
getHeader ($key, $valueIfNotFound = ноль)
Он получает текущий заголовок (если есть). Если значение не найдено, возвращается $valueIfNotFound. Обратите внимание: ключ $ всегда преобразуется в верхний регистр.
Пример:
$ token = $ this -> getHeader ( ' token ' , ' TOKEN NOT FOUND ' );
Синтаксис:
getBody ($jsonDeserialize = false, $asAssociative = true)
Он получает тело запроса.
Пример:
$ body = $ this -> getBody (); // '{"id"=>1,"name"=>john}' (as string)
$ body = $ this -> getBody ( true ); // stdClass {id=>1,name=>john}
$ body = $ this -> getBody ( true , true ); // ["id"=>1,"name"=>john]
Возвращает текущий базовый URL-адрес без пространства для перемещения, параметров или запросов.
Примечание . Эта функция зависит от $_SERVER['SERVER_NAME'] и может быть изменена конечным пользователем.
Он возвращает текущий сервер без косой черты.
$ route -> getCurrentServer (); // http://somedomain
Он устанавливает текущее имя сервера. Он используется методами getCurrentUrl() и getCurrentServer().
Примечание. Если $this->setCurrentServer() не установлен, то он использует $_SERVER['SERVER_NAME'] и может быть изменен пользователем.
$ route -> setCurrentServer ( ' localhost ' );
$ route -> setCurrentServer ( ' 127.0.0.1 ' );
$ route -> setCurrentServer ( ' domain.dom ' );
Он получает (полный) URL-адрес на основе информации в классе.
$ route -> getUrl (); // http://somedomain/controller/action/id
$ route -> getUrl ( ' id=20 ' ); // http://somedomain/controller/action/id?id=20
$ route -> getUrl ( ' id=20 ' , true ); // http://somedomain/controller/action/id?id=20&field=20&field2=40
Он создает URL-адрес на основе пользовательских значений.
$ route -> url ( null , " Customer " , " Update " , 20 ); // Customer/Update/20
Он создает URL-адрес (спереди) на основе пользовательских значений.
$ route -> url ( null , " Daily " , " Milk " , 20 ); // Daily/Milk/20
Если субдомен пуст или отличается от www, происходит перенаправление на www.domain.com.
Примечание. Он не работает с локальным хостом, доменом без TLD (netbios) или IP-доменами. Это специально.
Примечание. Если этот код необходимо перенаправить, он останавливает выполнение кода. Обычно его необходимо вызывать в верхней части кода.
$ route -> alwaysWWW (); // if the domain is somedomain.dom/url, then it redirects to www.somedomain.dom/url
$ route -> alwaysWWW ( true ); // if the domain is http: somedomain.dom/url, then it redirects to https: www.somedomain.dom/url
Если страница загружена как http, то она перенаправляется на https.
Примечание. Он не работает с локальным хостом, доменом без TLD (netbios) или IP-доменами. Это специально.
Примечание. Если этот код необходимо перенаправить, он останавливает выполнение кода. Обычно его необходимо вызывать в верхней части кода.
$ route -> alwaysHTTPS (); // http://somedomain.com ---> https://somedomain.com
$ route -> alwaysHTTPS (); // http://localhost ---> // http://localhost
$ route -> alwaysHTTPS (); // http://127.0.0.1 ---> // http://127.0.0.1
$ route -> alwaysHTTPS (); // http://mypc ---> // http://mypc
Если субдомен — www (пример www.domain.dom), то он перенаправляется на голый домен domain.dom.
Примечание. Он не работает с локальным хостом, доменом без TLD (netbios) или IP-доменами. Это специально.
Примечание. Если этот код необходимо перенаправить, он останавливает выполнение кода. Обычно его необходимо вызывать в верхней части кода.
$ route -> alwaysNakedDomain (); // if the domain is www.somedomain.dom/url, then it redirects to somedomain.dom/url
$ route -> alwaysNakedDomain ( true ); // if the domain is http: www.somedomain.dom/url, then it redirects to https: somedomain.dom/url
Поле | путь | Описание | Пример |
---|---|---|---|
$argumentName | Имя аргумента, используемого Apache .Htaccess и nginx. | $this-argumentName='req'; | |
$база | Это базовый URL. | $this->base=0; | |
$тип | Это тип URL-адреса (api,ws,controller или front). | эхо $this->type; // API | |
$модуль | {модуль} | Это текущий модуль | эхо $this->module; |
$контроллер | {контроллер} | Это контроллер. | эхо $this->контроллер; |
$действие | {действие} | Это действие. | эхо $this->action; |
$идентификатор | {идентификатор} | Это идентификатор | эхо $this->id; |
$событие | {событие} | Это событие (например, «нажмите кнопку»). | echo$this->событие; |
$idparent | {idparent} | Это текущий родительский идентификатор (если есть) | эхо $this->idparent; |
$экстра | {дополнительный} | Это событие (например, «нажмите кнопку») | эхо $this->extra; |
$категория | {категория} | Текущая категория. Это полезно для типа «передний» | эхо $this->категория; |
$подкатегория | {подкатегория} | Текущая подкатегория. Это полезно для типа «передний» | эхо $this->подкатегория; |
$subsubcategory | {подподкатегория} | Текущая подподкатегория. Это полезно для типа «передний» | эхо $this->подподкатегория; |
$идентифицировать | Это ассоциативный массив, который помогает идентифицировать маршрут API и WS. | $this->identify=['api'=>'apiurl','ws'=>'webservices','controller'=>'']; | |
$isPostBack | это правда, если страница POST, в противном случае ложь. | если ($this->isPostBack) { ... }; | |
$глагол | {глагол} | Текущий глагол может быть GET, POST, PUT и DELETE. | if ($this->verb) { ... }; |
Пример:
$ this -> addPath ( ' portal/web/{controller}/{action:list} ' );
$ this -> fetchPath ();
var_dump ( $ this -action); // it shows the current action or the default value "list" if none.
Поле | Описание | Пример |
---|---|---|
$allowedVerbs | Список разрешенных глаголов | $this->allowedVerbs=['GET', 'POST', 'PUT', 'DELETE']; |
$allowedFields | Список разрешенных полей, используемых callObjectEx() | $this->allowedFields=['контроллер', 'действие', 'глагол', 'событие', 'тип', 'модуль', 'id' , 'idparent','категория', 'подкатегория', 'подподкатегория']; |
установитьБелый список() | Он устанавливает ассоциативный массив с белым списком для контроллера , действия , категории , подкатегории , подподкатегории и модуля . Если не установлено (нулевое значение по умолчанию), то разрешена любая запись. В настоящее время он работает только с контроллером и категорией. | $this->setWhitelist('контроллер','Покупка','Счет','Клиент'); $this->setWhitelist('controller',null) // разрешает любой контроллер; |
Внесение метода в белый список позволяет выполнить две операции:
Например:
// Example, value not in the whitelist: someweb.dom/customer/list
$ this -> setWhiteList ( ' controller ' ,[ ' Product ' , ' Client ' ]);
$ this -> fetch ();
var_dump ( $ this -> controller ); // null or the default value
var_dump ( $ this -> notAllowed ); // true (whitelist error)
// Example, value in the whitelist but with the wrong case: someweb.dom/customer/list
$ this -> setWhiteList ( ' controller ' ,[ ' Customer ' ]);
$ this -> fetch ();
var_dump ( $ this -> controller ); // it shows "Customer" instead of "customer"
var_dump ( $ this -> notAllowed ); // false (not error with the validation of the whitelist)
// reset whitelist for controllers
$ this -> setWhiteList ( ' controller ' , null );
RouteOne содержит базовый интерфейс командной строки для создания и инициализации конфигурации. Бинарный интерфейс RouteOne находится в папкеvendor/bin.
./vendor/bin/ RouteOne cli
введите маршрутизатор и нажмите Enter.
В меню роутера отобразится следующий экран:
Ожидание означает, что операция ожидает выполнения или требует какой-либо настройки.
После завершения настройка будет помечена как «ОК».
Теперь давайте настроим пути