Маршрутизация
Имея готовые классы ресурсов и контроллеров, можно получить доступ к ресурсам, используя URL вроде http://localhost/index.php?r=user/create
, подобно тому, как вы это делаете с обычными Web-приложениями.
На деле вам обычно хочется включить «красивые» URL-адреса и использовать все преимущества HTTP-методов (HTTP-verbs). Например, чтобы запрос POST /users
означал обращение к действию user/create
. Это может быть легко сделано с помощью настройки компонента приложения urlManager
в конфигурации приложения следующим образом:
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => 'user'],
],
]
Главная новинка в коде выше по сравнению с управлением URL-адресами в Web-приложениях состоит в использовании [[yii\rest\UrlRule]] для маршрутизации запросов к RESTful API. Этот особый класс URL-правил будет создавать целый набор дочерних URL-правил для поддержки маршрутизации и создания URL-адресов для указанного контроллера (или контроллеров). Например, приведенный выше код является приближенным аналогом следующего набора правил:
[
'PUT,PATCH users/<id>' => 'user/update',
'DELETE users/<id>' => 'user/delete',
'GET,HEAD users/<id>' => 'user/view',
'POST users' => 'user/create',
'GET,HEAD users' => 'user/index',
'users/<id>' => 'user/options',
'users' => 'user/options',
]
Этим правилом поддерживаются следующие точки входа в API:
GET /users
: разбитый на страницы список всех пользователей;HEAD /users
: общая информация по списку пользователей;POST /users
: создание нового пользователя;GET /users/123
: подробная информация о пользователе 123;HEAD /users/123
: общая информация о пользователе 123;PATCH /users/123
иPUT /users/123
: обновление пользователя 123;DELETE /users/123
: удаление пользователя 123;OPTIONS /users
: список HTTP-методов, поддерживаемые точкой входа/users
;OPTIONS /users/123
: список HTTP-методов, поддерживаемые точкой входа/users/123
.
Вы можете настроить опции only
и except
, явно указав для них список действий, которые поддерживаются или которые должны быть отключены, соответственно. Например:
[
'class' => 'yii\rest\UrlRule',
'controller' => 'user',
'except' => ['delete', 'create', 'update'],
],
Вы также можете настроить опции patterns
или extraPatterns
для переопределения существующих шаблонов или добавления новых шаблонов, поддерживаемых этим правилом. Например, для включения нового действия search
в точке входа GET /users/search
настройте опцию extraPatterns
следующим образом:
[
'class' => 'yii\rest\UrlRule',
'controller' => 'user',
'extraPatterns' => [
'GET search' => 'search',
],
]
Как вы могли заметить, ID контроллера user
в этих точках входа используется в форме множественного числа (как users
). Это происходит потому, что [[yii\rest\UrlRule]] автоматически приводит идентификаторы контроллеров к множественной форме. Вы можете отключить такое поведение, назначив свойству [[yii\rest\UrlRule::pluralize]] значение false
.
Info: Приведение ID контроллера к множественной форме производится в методе [[yii\helpers\Inflector::pluralize()]]. При этом соблюдаются правила английского языка. Например,
box
будет преобразован вboxes
, а не вboxs
.
В том случае, если автоматическое приведение к множественному числу вам не подходит, вы можете настроить свойство [[yii\rest\UrlRule::controller]], где указать явное соответствие имени в URL и ID контроллера. Например, код ниже ставит в соответствие имя u
и ID контроллера user
.
[
'class' => 'yii\rest\UrlRule',
'controller' => ['u' => 'user'],
]
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)