Обработка RESTful-ресурсов
- Маршруты ресурсов
- ResourceController
- Маршруты презентера
- ResourcePresenter
- Сравнение презентера и контроллера
Передача репрезентационного состояния (REST) — это архитектурный стиль для распределённых приложений, впервые описанный Роем Филдингом в своей диссертации 2000 года, Architectural Styles and the Design of Network-based Software Architectures. Это может быть немного скучно, и вы можете найти более понятный вводный материал в модели зрелости Ричардсона Мартина Фаулера
REST интерпретировался и неправильно интерпретировался больше, чем большинство архитектур программного обеспечения, и может быть легче сказать, что чем больше принципов Роя Филдинга вы примените в архитектуре, тем более «RESTful» ваше приложение будет считаться.
CodeIgniter упрощает создание RESTful API для ваших ресурсов с помощью маршрутов ресурсов и ResourceController.
Маршруты ресурсов
Вы можете быстро создать несколько RESTful маршрутов для одного ресурса с помощью метода resource(). Это создаёт пять самых распространённых маршрутов, необходимых для полного CRUD-обработки ресурса: создание нового ресурса, обновление существующего, вывод всех ресурсов, отображение одного ресурса и удаление одного ресурса. Первый параметр — имя ресурса:
$routes->resource('photos');
// Equivalent to the following:
$routes->get('photos/new', 'Photos::new');
$routes->post('photos', 'Photos::create');
$routes->get('photos', 'Photos::index');
$routes->get('photos/(:segment)', 'Photos::show/$1');
$routes->get('photos/(:segment)/edit', 'Photos::edit/$1');
$routes->put('photos/(:segment)', 'Photos::update/$1');
$routes->patch('photos/(:segment)', 'Photos::update/$1');
$routes->delete('photos/(:segment)', 'Photos::delete/$1');
Примечание
Порядок выше приведен для ясности, тогда как фактический порядок создания маршрутов в RouteCollection гарантирует правильное разрешение маршрутов
Важно
Маршруты сопоставляются в том порядке, в котором они указаны, поэтому если у вас есть ресурс photos выше, а затем get ‘photos/poll’ действие show для ресурса line будет сопоставлено до get строки. Чтобы исправить это, поместите строку get выше строки ресурса, чтобы она сопоставлялась первой.
Второй параметр принимает массив опций, которые могут быть использованы для изменения сгенерированных маршрутов. Хотя эти маршруты ориентированы на использование API, где разрешено больше методов, вы можете передать опцию «websafe», чтобы она генерировала методы update и delete, которые работают с HTML-формами:
$routes->resource('photos', ['websafe' => 1]);
// The following equivalent routes are created:
$routes->post('photos/(:segment)/delete', 'Photos::delete/$1');
$routes->post('photos/(:segment)', 'Photos::update/$1');
Изменение используемого контроллера
Вы можете указать контроллер, который должен использоваться, передав опцию controller с именем контроллера, который должен использоваться:
$routes->resource('photos', ['controller' =>'App\Gallery']);
// Would create routes like:
$routes->get('photos', 'App\Gallery::index');
Изменение используемого плейсхолдера
По умолчанию используется плейсхолдер segment, когда необходим идентификатор ресурса. Вы можете изменить его, передав опцию placeholder с новой строкой для использования:
$routes->resource('photos', ['placeholder' => '(:num)']);
// Generates routes like:
$routes->get('photos/(:num)', 'Photos::show/$1');
Ограничение создаваемых маршрутов
Вы можете ограничить создаваемые маршруты с помощью опции only. Это должен быть массив или список, разделённый запятыми, имён методов, которые должны быть созданы. Будут созданы только маршруты, соответствующие одному из этих методов. Остальные будут проигнорированы:
$routes->resource('photos', ['only' => ['index', 'show']]);
В противном случае вы можете удалить неиспользуемые маршруты с помощью опции except. Эта опция выполняется после only:
$routes->resource('photos', ['except' => 'new,edit']);
Допустимые методы: index, show, create, update, new, edit и delete.
ResourceController
ResourceController предоставляет удобную отправную точку для вашего RESTful API с методами, соответствующими вышеуказанным маршрутам ресурсов.
Расширьте его, переопределяя свойства modelName и format, а затем реализуйте те методы, которые хотите обработать:
<?php
namespace App\Controllers;
use CodeIgniter\RESTful\ResourceController;
class Photos extends ResourceController
{
protected $modelName = 'App\Models\Photos';
protected $format = 'json';
public function index()
{
return $this->respond($this->model->findAll());
}
// ...
}
Маршрутизация для этого будет:
$routes->resource('photos');
Маршруты презентера
Вы можете быстро создать контроллер презентации, соответствующий контроллеру ресурса, используя метод presenter(). Это создаёт маршруты для методов контроллера, которые будут возвращать представления для вашего ресурса или обрабатывать формы, отправленные из этих представлений.
Он не нужен, так как представление может быть обработано с помощью обычного контроллера — это удобство. Его использование аналогично маршрутизации ресурсов:
$routes->presenter('photos');
// Equivalent to the following:
$routes->get('photos/new', 'Photos::new');
$routes->post('photos/create', 'Photos::create');
$routes->post('photos', 'Photos::create'); // alias
$routes->get('photos', 'Photos::index');
$routes->get('photos/show/(:segment)', 'Photos::show/$1');
$routes->get('photos/(:segment)', 'Photos::show/$1'); // alias
$routes->get('photos/edit/(:segment)', 'Photos::edit/$1');
$routes->post('photos/update/(:segment)', 'Photos::update/$1');
$routes->get('photos/remove/(:segment)', 'Photos::remove/$1');
$routes->post('photos/delete/(:segment)', 'Photos::delete/$1');
Примечание
Порядок выше приведен для ясности, тогда как фактический порядок создания маршрутов в RouteCollection гарантирует правильное разрешение маршрутов
У вас не будет маршрутов photos для контроллера ресурса и контроллера презентации. Вам нужно их различать, например:
$routes->resource('api/photo');
$routes->presenter('admin/photos');
Второй параметр принимает массив опций, которые могут быть использованы для изменения сгенерированных маршрутов.
Изменение используемого контроллера
Вы можете указать контроллер, который должен использоваться, передав опцию controller с именем контроллера, который должен использоваться:
$routes->presenter('photos', ['controller' =>'App\Gallery']);
// Would create routes like:
$routes->get('photos', 'App\Gallery::index');
Изменение используемого плейсхолдера
По умолчанию используется плейсхолдер segment, когда необходим идентификатор ресурса. Вы можете изменить его, передав опцию placeholder с новой строкой для использования:
$routes->presenter('photos', ['placeholder' => '(:num)']);
// Generates routes like:
$routes->get('photos/(:num)', 'Photos::show/$1');
Ограничение создаваемых маршрутов
Вы можете ограничить создаваемые маршруты с помощью опции only. Это должен быть массив или список, разделённый запятыми, имён методов, которые должны быть созданы. Будут созданы только маршруты, соответствующие одному из этих методов. Остальные будут проигнорированы:
$routes->presenter('photos', ['only' => ['index', 'show']]);
В противном случае вы можете удалить неиспользуемые маршруты с помощью опции except. Эта опция выполняется после only:
$routes->presenter('photos', ['except' => 'new,edit']);
Допустимые методы: index, show, new, create, edit, update, remove и delete.
ResourcePresenter
ResourcePresenter предоставляет удобную отправную точку для отображения представлений вашего ресурса и обработки данных из форм в этих представлениях с методами, соответствующими вышеуказанным маршрутам ресурсов.
Расширьте его, переопределяя свойство modelName, а затем реализуйте те методы, которые хотите обработать:
<?php
namespace App\Controllers;
use CodeIgniter\RESTful\ResourcePresenter;
class Photos extends ResourcePresenter
{
protected $modelName = 'App\Models\Photos';
public function index()
{
return view('templates/list', $this->model->findAll());
}
// ...
}
Маршрутизация для этого будет:
$routes->presenter('photos');
Сравнение презентера и контроллера
Эта таблица представляет сравнение по умолчанию маршрутов, созданных resource() и presenter(), с соответствующими функциями контроллера.
| Операция | Метод | Маршрут контроллера | Маршрут презентера | Функция контроллера | Функция презентера |
|---|---|---|---|---|---|
| Новый | GET | photos/new | photos/new | new() |
new() |
| Создать | POST | photos | photos | create() |
create() |
| Создать (псевдоним) | POST | photos/create | create() |
||
| Список | GET | photos | photos | index() |
index() |
| Показать | GET | photos/(:segment) | photos/(:segment) | show($id = null) |
show($id = null) |
| Показать (псевдоним) | GET | photos/show/(:segment) | show($id = null) |
||
| Изменить | GET | photos/(:segment)/edit | photos/edit/(:segment) | edit($id = null) |
edit($id = null) |
| Обновить | PUT/PATCH | photos/(:segment) | update($id = null) |
||
| Обновить (websafe) | POST | photos/(:segment) | photos/update/(:segment) | update($id = null) |
update($id = null) |
| Удалить | GET | photos/remove/(:segment) | remove($id = null) |
||
| Удалить | DELETE | photos/(:segment) | delete($id = null) |
||
| Удалить (websafe) | POST | photos/delete/(:segment) | delete($id = null) |
delete($id = null) |
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/user_guide/incoming/restful.html