Логика RESTfull API

159
27 января 2018, 00:11

Интересует общепринятый принцип построения RESTful API. В качестве бекэнда использовать планирую yii2 standart. Поставил сейчас свежую версию через композер, убрал web из адресной строки с помощью .htaccess.

Я представлял себе API как action класса, который возвращает нужные данные. Скажем, в БД есть таблица с данными о Клиентах и таблицах с данными о их Обращениях. Прикидывал, что можно сделать action, который бы сразу же вернул бы мне в одном json данные клиента и его обращения. Но если посмотреть на документацию yii2, то там есть примеры только по типу "одна модель - один action". Т.е. чтобы получить мне данные о клиенте и его обращениях мне нужно сделать два запроса на сервер. А если цепочка таблиц будет больше, то и запросов придётся сделать столько же. И потом это всё крутить-парсить на стороне vue.js.

Так как всё же правильно? Модель-action? Или же можно делать совмещённые action, которые возвращают данные сразу от нескольких моделей. Или может что-то другое? Быть может есть ещё какие-то подходы? Советы?

Answer 1

Дока http://www.yiiframework.com/doc-2.0/guide-rest-resources.html

Можно в одном запросе выводить данные о клиенте и его сообщениях. Есть два способа такой реализации:

  1. В модели users метод fields возвращает связь с таблицей messages

    class Users extends ActiveRecord
    {
        public function fields()
        {
            return [
                'id',
                'name',
                'messages' => 'messages',
           ];
        }
        public function getMessages()
        {
            return $this->hasMany(Messages::className(), ['user_id' => 'id']);
        }
    }
  2. Передавать специальный get параметр expand (http://localhost/user?expand=messages). В этом случаи в модели должен быть метод extraFields

    class Users extends ActiveRecord
    {
        public function fields()
        {
            return [
                'id',
                'name',
           ];
        }
        public function extraFields()
        {
            return [
                'messages',
            ];
        }
        public function getMessages()
        {
            return $this->hasMany(Messages::className(), ['user_id' => 'id']);
        }
    }
Answer 2

Совет простой: не использовать ActiveController. Используйте обычный yii\rest\Controller, в конфиге приложения укажите:

    'request' => [
        'parsers' => [
            'application/json' => 'yii\web\JsonParser',
        ],

И формируйте данные как вам удобно. Без эктив рэкорда или с ним, это вообще не важно.

READ ALSO
Разные ip адреса

Разные ip адреса

На компьютере все правильноСкриншот ниже

168
Как правильно оформлять php файлы?

Как правильно оформлять php файлы?

Вот у меня допустим есть простенький скрипт авторизации:

193
Php2 шифрование

Php2 шифрование

Здравствуйте! Есть ли способы обратимо зашифровать строку на php версии 2x? openssl_encrypt, crypt включены с 3 и 4 версии php соответственно

152
Стоит ли так рефакторить? Замена условий на простые математические формулы

Стоит ли так рефакторить? Замена условий на простые математические формулы

Периодически делаю мелкий рефакторинг своего кода над текущим проектом, я раньше вообще не занимался этим и только начинаю изучать это делоВот...

240