RESTfull

Оглавление

1. Введение
2. Регистрация маршрутов
3. Правила построения маски
4. Callback
5. Управление приложением
6. Список методов




Введение #
К оглавлению

Этот вид организации роутинга подходит либо для небольших сайтов, либо для полноценных RESTfull приложений.

Для того, чтобы воспользоваться этим видом роутинга, нужно инициализировать роутер, а после организации маршрутов запустить приложение:
www\index.php
1
2
3
4
5
6
7
8
9
10
11
<?php   

    
require __DIR__ .'/../vendor/ABC/ABC.php'
    
$local = require __DIR__ .'/configs/local.php'

    
$router ABC::Router($local); 
     
    
// Здесь маршрутизация 
     
    
ABC::run(); 






Регистрация маршрутов #
К оглавлению

Регистрация маршрутов этим способом производится с помощью соответствующих методов роутера. Каждый такой метод соответствует методу HTTP запроса. Поддерживаются все методы RESTfull, такие как:
GET
POST
PUT
DELETE
CONNECT
HEAD
OPTIONS
PATCH
TRACE

К сожалению на сегодняшний день HTML поддерживает только два первых метода (в HTML-5 должны ввести все), что затрудняет реализацию RESTfull. Только если используется технология AJAX, можно пользоваться любым методом.

Однако наш фреймворк понимает псевдо-методы.
Для этого нужно в форму добавить скрытое поле с именем "_method", и указать метод в нем:
1
2
3
4
5
6
7
 
<form method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="submit" value="Go!" />
</form>



Роут, это вызов метода роутера с обязательными двумя параметрами. Первый, это маска, второй - callback, который будет вызван, если URI будет соответствовать этой маске. Простейший пример:
www\index.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php     

    
require __DIR__ .'/../vendor/ABC/ABC.php';  
    
$local = require __DIR__ .'/configs/local.php';  
    
// Инициализация роутера  
    
$router ABC::Router($local);  

    
// Первый роут  
    
$router->get('/', function($request$response$arg) {  
       
        
$response->write('<a href="/hello/World">Пуск</a>');  
        return 
$response;  
          
    });  

    
// Второй роут  
    
$router->get('/hello/{name}', function($request$response$arg) {  
       
        
$name $request->getAttribute('name');  
        
$response->write("Hello, $name!");  
        return 
$response;  
          
    });  

    
// Старт  
    
ABC::run(); 






Правила построения маски. #
К оглавлению

1. Простой текст воспринимается жестко, по полному совпадению.

2. Текстом в фигурных скобках ({имя}) является имя GET-параметра, в которое будет подставлено значение из URI.

3. Если указан именованный параметр, и, через двоеточие, регулярное выражение {имя:RegExp}), будет осуществляться поиск по этому выражению.

4. Callback будет вызван при первом совпадении.




Callback #
К оглавлению

Вотрым параметром методов роутера должен быть действительный callback. Им может быть анонимная функция (как в примере выше), или имя функции, или имя класса, содержащего магический метод __invoke(). Так же можно использовать класс middleware по стандарту PSR-15 с методом process()

К примеру так:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php   

    require 
__DIR__ .'/../vendor/ABC/ABC.php';  
    
$local = require __DIR__ .'/configs/local.php';  
    
$router ABC::Router($local);
    
    
// Вторым аргументом объект 
    
$router->get('/hello/{name}', new helloWorld); 

    
// или полное имя класса с немспейсом 
    
$router->get('/hi/{name}''\ABC\helloWorld'); 
    
    
ABC::run(); 




Сработает любой из этих вариантов:
1.
1
2
3
4
5
6
7
8
9


    
function helloWorld($request$response)   
    {  
        
$name $request->getAttribute('name');  
        
$response->write("Hello, $name!");  
        return 
$response;  
    }  




2.
1
2
3
4
5
6
7
8
9
10
11
12


class  helloWorld  
{  
    public function 
__invoke($request$response)   
    {  
        
$name $request->getAttribute('name');  
        
$response->write("Hello, $name!");  
        return 
$response;  
    }  
}  




3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14


class  helloWorld  
{  
    public function 
process($request)   
    {
        
$name $request->getAttribute('name');
        
$http ABC::newService(ABC::HTTP);          
        
$response $http->createResponse();
        
$response->write("Hello, $name!"); 
        return 
$response;         
    }  




Обратите внимание, что если использовать строки, то передавать нужно полное имя функции или класса, с немспейсом, в котором они находятся.

Функция или метод могут принимать два аргумента, объекты классов Request и Response. И возвращать объект Response по стандарту PSR-7. Подробнее можно узнать здесь.



Управление приложением #
К оглавлению

С помощью этого способа роутинга можно так же управлять приложением. Для этого нужно вторым аргументом вместо callback передать строку с названиями контроллера и экшена, разделенных "собачкой". Тогда они будут задействованы, в них будет переданы сформированные GET-параметры, а результат будет помещен в Response. Метод ABC::run() отправит его в поток.
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php 

    require 
__DIR__ .'/../vendor/ABC/ABC.php';
    
$local = require __DIR__ .'/configs/local.php';
    
$router ABC::Router($local);
    
    
$router->get('/''main@index');
    
$router->put('/guest/{num:\d+}''guest@edit');
    
ABC::run(); 






Список методов #
К оглавлению

1 get() Отрабатывает запросы с методом GET
2 post() Отрабатывает запросы с методом POST
3 put() Отрабатывает запросы с методом PUT
4 delete() Отрабатывает запросы с методом DELETE
5 any() Отрабатывает запросы с любыми выбранными методами
6 all() Отрабатывает запросы с любым валидным методом




get() public method
К списку методов

Обработка метода GET

Если HTTP запрос пришел с методом GET, URI будет сопоставлен с маской роута

public Router::get ( $pattern, $callable )
$pattern string Маска роута
$callable callable Callback функция
return $this Объект роутера




post() public method
К списку методов

Обработка метода POST

Если HTTP запрос пришел с методом POST, URI будет сопоставлен с маской роута

public Router::post ( $pattern, $callable )
$pattern string Маска роута
$callable callable Callback функция
return $this Объект роутера




put() public method
К списку методов

Обработка метода PUT

Если HTTP запрос пришел с методом PUT, URI будет сопоставлен с маской роута

public Router::put ( $pattern, $callable )
$pattern string Маска роута
$callable callable Callback функция
return $this Объект роутера




delete() public method
К списку методов

Обработка метода DELETE

Если HTTP запрос пришел с методом DELETE, URI будет сопоставлен с маской роута

public Router::delete ( $pattern, $callable )
$pattern string Маска роута
$callable callable Callback функция
return $this Объект роутера




any() public method
К списку методов

Обработка указанных методов

Если HTTP запрос пришел с методом, указанным в массиве, переданным первым аргументом, URI будет сопоставлен с маской роута

public Router::any ( $methods, $pattern, $callable )
$methods string|array HTTP-метод (или методы в виде массива), на которые отреагирует роут
$pattern string Маска роута
$callable callable Callback функция
return $this Объект роутера




all() public method
К списку методов

Обработка любых методов

URI будет сопоставлен с маской роута при любом валидном HTTP-методе

public Router::all ( $methods, $pattern, $callable )
$pattern string Маска роута
$callable callable Callback функция
return $this Объект роутера