From d1fe76e765d7435d624a552c0e29ce55180ed9de Mon Sep 17 00:00:00 2001 From: Mikhail Bazhenov Date: Tue, 22 Jul 2014 16:27:25 +0800 Subject: [PATCH] Doc translate for rest-resources --- docs/guide-ru/rest-resources.md | 204 ++++++++++++++++++++++++++++++++ 1 file changed, 204 insertions(+) create mode 100644 docs/guide-ru/rest-resources.md diff --git a/docs/guide-ru/rest-resources.md b/docs/guide-ru/rest-resources.md new file mode 100644 index 0000000000..f0141d0827 --- /dev/null +++ b/docs/guide-ru/rest-resources.md @@ -0,0 +1,204 @@ +Ресурсы +========= + +RESTful API интерфейсы предназначены для доступа и управления *ресурсами*. Вы можете представлять ресурсы как +[модели](structure-models.md) в архитектуре [MVC](http://ru.wikipedia.org/wiki/Model-View-Controller). + +Хотя в Yii нет никаких ограничений в том как представить ресурс, здесь вы можете представлять ресурсы +как объект наследующий свойства и методы [[yii\base\Model]] или дочерних классов (например [[yii\db\ActiveRecord]]), потому как: + +* [[yii\base\Model]] реализует [[yii\base\Arrayable]] интерфейс, настраиваемый как вам удобно, для представления +данных через RESTful API интерфейс. +* [[yii\base\Model]] поддерживает [валидацию](input-validation.md), что полезно для RESTful API + реализующего ввод данных. +* [[yii\db\ActiveRecord]] реализует мощный функционал для работы с БД, будет полезным если данные ресурса хранятся в поддерживаемых БД. + +В этом разделе, мы опишем как использовать методы наследуемые вашим класом ресурсов от [[yii\base\Model]] (или дочерних классов) необходимые RESTful API. +> Если класс ресурса не наследуется от [[yii\base\Model]], то будут возвращены все public поля. + + +## Поля + +Когда ресурс включается в ответ RESTful API, необходимо представить(сеарилизовать) ресурс как строку. +Yii разбивает процесс сеарилизации на два шага. На первом шаге, ресурс конвертируется в массив [[yii\rest\Serializer]]. +На втором шаге, массив сеарилизуется в строку в требуемом формате (JSON, XML) при помощи +[[yii\web\ResponseFormatterInterface|интерфейса для форматирования ответа]]. Это сделано для того чтобы при разработке вы могли сосредоточится на разработке класса ресурсов. + +При переопределении методов [[yii\base\Model::fields()|fields()]] и/или [[yii\base\Model::extraFields()|extraFields()]], +вы можете указать какие данные будут отображаться при представлении в виде массива. +Разница между этими двумя методами в том, что первый определяет стандартный набор полей которые будут включены в представлении массивом, а второй +определяет дополнительные поля, которые могут быть включены в массив если запрос пользователя к ресурсу использует дополнительные параметры. +Например: + +``` +// вернёт все поля объявленные в fields() +http://localhost/users + +// вернёт только поля id и email, если они объявлены в методе fields() +http://localhost/users?fields=id,email + +// вернёт все поля обявленные в fields() и поле profile если оно указано в extraFields() +http://localhost/users?expand=profile + +// вернёт только id, email и profile, если они объявлены в fields() и extraFields() +http://localhost/users?fields=id,email&expand=profile +``` + + +### Переопределение `fields()` + +По умолчанию, [[yii\base\Model::fields()]] вернёт все атрибуты модели как поля, пока что +[[yii\db\ActiveRecord::fields()]] возвращает только те атрибуты которые были объявлены в схеме БД. + +Вы можете переопределить `fields()` при этом добавить, удалить, переименовать или переобъявить поля. Возвращаемое значение `fields()` +должно быть массивом. Ключи массива это имена полей, и значения массива могут быть именами свойств/атрибутов или анонимных функций, возвращающих соответсвующее значение полей. +Если имя атрибута такое же, как ключ массива вы можете не заполнять значение. Например: +```php +// явное перечисление всех атрибутов, лучше всего использовать когда вы хотите убедиться что изменение +// таблицы БД или атрибутов модели не повлияет на изменение полей в представлении для API (для поддержки обратной совместимости с API). +public function fields() +{ + return [ + // название поля совпадает с названием атрибута + 'id', + // ключ массива "email", соответсвует значению атрибута "email_address" + 'email' => 'email_address', + // ключ массива "name", это PHP callback функция возвращающая значение + 'name' => function () { + return $this->first_name . ' ' . $this->last_name; + }, + ]; +} + +// Для фильтрации полей лучше всего использовать, поля наследуемые от родительского класса +// и blacklist для не безопасных полей. +public function fields() +{ + $fields = parent::fields(); + + // удаляем не безопасные поля + unset($fields['auth_key'], $fields['password_hash'], $fields['password_reset_token']); + + return $fields; +} +``` + +> Внимание: По умолчанию все атрибуты модели будут включены в представление для API, вы должны +> убедиться что не безопасные данные, не попадут в представление. Если в модели есть не безопасные поля, +> вы должны переопределить метод `fields()` для их фильтрации. В приведённом примере +> мы удаляем из представления `auth_key`, `password_hash` и `password_reset_token`. + + +### Переопределение `extraFields()` + +По умолчанию, [[yii\base\Model::extraFields()]] ничего не возвращает, а [[yii\db\ActiveRecord::extraFields()]] +возвращает названия отношений объявленных в ДБ. + +Формат вовзращаемызх данных `extraFields()` такой же как `fields()`. Как правило, `extraFields()` +используется для указания полей, значения которых являются объектами. Например учитывая следующее объявление полей + +```php +public function fields() +{ + return ['id', 'email']; +} + +public function extraFields() +{ + return ['profile']; +} +``` + +запрос `http://localhost/users?fields=id,email&expand=profile` может возвращать следующие JSON данные: + +```php +[ + { + "id": 100, + "email": "100@example.com", + "profile": { + "id": 100, + "age": 30, + } + }, + ... +] +``` + + +## Связи + +[HATEOAS](http://en.wikipedia.org/wiki/HATEOAS), аббревиатура для Hypermedia as the Engine of Application State, +необходим для того чтобы RESTful API, мог отобразить информацию которая позволяет клиентам просматривать возможности, поддерживаемые ресурсом. Ключ HATEOAS возвращает список ссылок с +информацией о параметрах доступных в методах API. +Ваши классы ресурсов могу поддерживать HATEOAS реализуя [[yii\web\Linkable]] интерфейс. Интерфейс +реализует один метод [[yii\web\Linkable::getLinks()|getLinks()]] который возвращает список [[yii\web\Link|links]]. +Вы должны вернуть существующий URL на метод ресурса. Например: + +```php +use yii\db\ActiveRecord; +use yii\web\Link; +use yii\web\Linkable; +use yii\helpers\Url; + +class User extends ActiveRecord implements Linkable +{ + public function getLinks() + { + return [ + Link::REL_SELF => Url::to(['user/view', 'id' => $this->id], true), + ]; + } +} +``` + +При отправке ответа объект `User` будет содержать поле `_links` содержащий ссылки связанные с объектом `User`. +Например: +``` +{ + "id": 100, + "email": "user@example.com", + // ... + "_links" => [ + "self": "https://example.com/users/100" + ] +} +``` + + +## Коллекции + +Объекты ресурсов могут групироваться в *коллекции*. Каждая коллекция включает список объектов ресурсов одного типа. + +Так как коллекции представляются в виде массива, их удобнее использовать как [проводник данных](output-data-providers.md). +Так как проводник данных поддерживает операции сортировки, разбиения на страницы это удобно использовать для RESTful API. +Например следующей метод возвращает проводник данных о почтовом ресурсе: + +```php +namespace app\controllers; + +use yii\rest\Controller; +use yii\data\ActiveDataProvider; +use app\models\Post; + +class PostController extends Controller +{ + public function actionIndex() + { + return new ActiveDataProvider([ + 'query' => Post::find(), + ]); + } +} +``` + +При отправке ответа RESTful API, [[yii\rest\Serializer]] добавит текущую страницу ресурсов и сеарилизует все объекты ресурсов. +Кроме того, [[yii\rest\Serializer]] добавит HTTP заголовки содержащие информацию о нумерации страниц: + +* `X-Pagination-Total-Count`: Количество ресурсов; +* `X-Pagination-Page-Count`: Количество страниц ресурсов; +* `X-Pagination-Current-Page`: Текущая страница (начинается с 1); +* `X-Pagination-Per-Page`: Количество ресурсов отображаемых на 1 странице; +* `Link`: Набор ссылок позволяющий клиенту пройти все ресурсы, страница за страницей. + +Примеры вы можете найти в разделе [Быстрый старт](rest-quick-start.md#trying-it-out).