авторы 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
Это всё в любом случае убережет вас от множества отдельных методов для каждого конкретного случая, уберет сильную связанность версий фронта от бека и сделает код чище.
Если вы не пользуетесь ресурсами - самое время перестроить прямо сейчас свои проекты и двигаться быстрее