Spec-Zone.ru › CodeIgniter 4

Обработка 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API