Ресурсы GraphQl

авторы graphQl хотели добиться максимальной гибкости при взаимодействии клиента и сервера. Сервер не должен знать обо всех клиентских версиях и набора данных в каждый момент. А поиск должен проходить по переданным клиентам условиям и с подтягиванием указанных клиентом связей

Если брать graphQl целиком - он слишком объемен и сложен. Возможность указать клиенту условия, а также связи дает потенциальную возможность злоумышленнику загрузить сервер, положить его, Достаточно запросить данные друзей друзей друзей. Для защиты от перегруза каждый придумывает свои механизмы
Давно еще нас учили не доверять клиенту, а здесь у него полная свобода

Перетягивание всего механизма graphql слишком объемно и сложно, особенно для простых проектов.

Но сама идея запросов ресурсов через клиента в рамках дозволенного - реализуется достаточно просто и не требует каких-либо серьезных затрат и алгоритмов, что позволяет использовать их в обычном запросе.

На PHP код можно наложить на ORM через отдельный метод resource, в котором вручную передать массив из запрошенных значений и соответствующих вывод

<?php
class user{
function resource$resource=null){
$item=[];
if (!empty($resource['id']))$item['id']=$this->id;
if (!empty($resource['register_date']))$item['register_date']=$this->register_date;
if (!empty($resource['last_active']))$item['last_active']=$this->last_active;
if (!empty($resource['is_admin']))$item['is_admin']=$this->is_admin();
if (!empty($resource['avatar']))$item['avatar']=$this->avatar();
if (!empty($resource['lname']))$item['lname']=$this->lname;
if (!empty($resource['lname_short']))$item['lname_short']=mb_substr($this->lname,0,1);
if (!empty($resource['mark']))$item['mark']=$this->mark;
if (!empty($resource['files']))$item['files']=$this->files()->resource($resource['files']); // Relation example
return $item;
}

function adminResource($resource=null){
$item=$this->resourceBase($resource);
if (!empty($resource['some_admin_data']))$item['some_admin_data']=$this->someAdminData();
if (!empty($resource['fio']))$item['fio']=$this->fio();
if (!empty($resource['fi']))$item['fi']=$this->fi();
return $item;
}

}

Метод можно ограничить доступными свойствами для каждого конкретного сценария, чтобы не нарушать безопасность

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

И в примерах приведена реализация отношения. Files. Клиент вызывает массив с ключом files а в качестве значения - указывает данные ресурса уже файлов. Реализация отношений естественно зависит от реализации ORM

Пример ориентирован на использование ORM от Core Framework

Это всё в любом случае убережет вас от множества отдельных методов для каждого конкретного случая, уберет сильную связанность версий фронта от бека и сделает код чище.

Если вы не пользуетесь ресурсами - самое время перестроить прямо сейчас свои проекты и двигаться быстрее

 

  • Автор: kosmom
  • Рейтинг: 0
  • Просмотров: 433
  • Комментариев: 0
  • Создан: 02.01.2023 16:14

Комментарии (0)

Ваши предложения и пожелания пишите на pro@kosmom.ru

Теги

backup bootstrap core framework eloquent excel home project html ios javascript keep-alive kpi laravel legacy mvp orm php rip scroll timestamp undefined vue vuetify watch безопасность биометрический паспорт ваша любаша для путешествий загран на 10 лет загран паспорт загранпаспорт нового образца зимние книги как заполнить анкеты кеширование книги на новый год логирование мцф недвижимость новогодние книги образец заполнения антеты паспорт для путешествий паспорт нового поколения печать продукт проектирование прокси разработка ремонт ремонт в апартаментах ремонт нежилого помещения самокат сдача сколько стоил ремонт апартаментов спорт стандарты таблица финансы хостинг цена ремонта что почитать зимой юзабилити

Случайный пост

14.05.2015 11:20
Неделя 13 - 19 апреля 2015 года