@graphql_ru
GraphQL — русскоговорящее сообщество

Общаемся на темы, посвященные GraphQL и опыту его использования. Проблемы. Новости. Решения. Вам могут быть полезны: @apollo_ru, @react_js, @vuejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание в чате было полезным и комфортным.

352 members

Архив канала @graphql_ru 12 марта 2018 г.

01:12:00 ПП
User 155098870
Всем привет, ктонибудь на symfony с graphql работал?
01:57:20 ПП
User 321317845
@alan_lans я
01:57:56 ПП
User 155098870
User 321317845
@alan_lans я
Трабл есть,  не могу понять как работает resolver alias, можегт подсказать?
01:58:43 ПП
User 321317845
это что такое?
01:58:50 ПП
User 321317845
в graphql такого нету
01:59:11 ПП
User 155098870
а ты через какое расширение с графql работаешь?
01:59:18 ПП
User 155098870
overblog ?
01:59:29 ПП
01:59:48 ПП
User 321317845
у меня свой стек
01:59:54 ПП
01:59:55 ПП
User 321317845
https://github.com/railt/railt
github.com/railt/railt
A PHP GraphQL Framework. Contribute to railt/railt development by creating an account on GitHub.
02:00:55 ПП
User 155098870
ясненько. Спасибо)
02:01:33 ПП
User 321317845
Скоро уже релиз будет. Надо будет доки закончить, тесты допилить и мб на хабре статью написать
02:01:44 ПП
User 321317845
Возможно заинтересуешься =)
03:38:50 ПП
User 228403837
User 321317845
Скоро уже релиз будет. Надо будет доки закончить, тесты допилить и мб на хабре статью написать
мое мнение - связывание схемы и имплементации ОТ схемы (через аннотации ) - это рак
03:39:09 ПП
User 228403837
ты таким образом закрываешь возможность подменять реализацию схемы
03:39:15 ПП
User 228403837
лишняя связанность
03:39:51 ПП
User 228403837
User 155098870
overblog ?
шлак
03:39:56 ПП
User 321317845
@fes0r это всего лишь экстеншн, который можно отключить
03:40:11 ПП
User 228403837
User 321317845
@fes0r это всего лишь экстеншн, который можно отключить
я понимаю, я лишь сформулировал мысль которую не мог родить тебе 4 месяц назад)
03:40:20 ПП
User 155098870
User 228403837
шлак
Почему шлак?
03:40:32 ПП
User 321317845
User 228403837
я понимаю, я лишь сформулировал мысль которую не мог родить тебе 4 месяц назад)
а лучшего варианта мы не придумали
03:40:37 ПП
User 228403837
User 155098870
Почему шлак?
а ты считаешь что все красиво и удобно?)
03:40:57 ПП
User 228403837
User 321317845
а лучшего варианта мы не придумали
достаточно просто привязвывать имплементацию к схеме, можно хоть так же через аннотации но схема ничего об имплементации знать не должна
03:41:08 ПП
User 228403837
надо свою реализацию тоже допилить
03:41:14 ПП
User 321317845
ну как вариант, да
03:41:19 ПП
User 228403837
здоровая конкуренция твоему решению не помешает)
03:41:30 ПП
User 228403837
тем более что я 90% что буду юзать твой парсер
03:41:44 ПП
User 228403837
webonyx это та еще боль
03:41:55 ПП
User 321317845
@fes0r 

$container->get(Router::class)->add(...)
03:42:01 ПП
User 228403837
User 321317845
@fes0r 

$container->get(Router::class)->add(...)
ммм... что?
03:42:01 ПП
03:42:02 ПП
User 228403837
зачем?
03:42:03 ПП
User 155098870
User 228403837
а ты считаешь что все красиво и удобно?)
ну не совсем удобно, но какие ещё варианты есть?
03:42:26 ПП
User 321317845
User 228403837
ммм... что?
добавление роутов без указания директив на схеме
03:42:47 ПП
User 321317845
вот даже методы: https://github.com/railt/railt/blob/master/src/Routing/Contracts/RouterInterface.php
github.com/railt/railt/blob/master/src/Routing/Contracts/RouterInterface.php
railt - The Railt GraphQL Framework
03:42:52 ПП
User 228403837
/**
 * @Query("latestPosts")
 */
public function latestPosts(PostRepository $posts) {
    return $posts->latest();
}
03:42:57 ПП
User 228403837
у меня так
03:43:22 ПП
User 321317845
ни в коем случае так не делай
03:43:24 ПП
User 321317845
это рак
03:43:26 ПП
User 321317845
уже проходил
03:43:28 ПП
User 228403837
почему?)
03:43:31 ПП
User 321317845
т.е. не аннотации
03:43:36 ПП
User 321317845
а вот такое указание путей
03:43:37 ПП
User 228403837
почему?
03:43:44 ПП
User 321317845
рекурсивные связи
03:43:45 ПП
User 228403837
аргументы?
03:44:05 ПП
User 321317845
user.posts.author.posts.author.posts
03:44:06 ПП
User 228403837
/**
 * @Query("recursive", type="SomeType")
 */
03:44:07 ПП
03:44:11 ПП
03:44:15 ПП
User 321317845
я привёл выше пример тебе
03:44:21 ПП
User 228403837
ну а я тебе привел как это решается
03:44:28 ПП
User 228403837
добавлением типа
03:44:32 ПП
03:44:39 ПП
User 321317845
а, ну если так
03:44:50 ПП
User 228403837
ну то есть ты не думай - я уже простенькие апишки пилил)
03:44:51 ПП
User 321317845
а указанием типа без указания пути?)
03:44:56 ПП
User 228403837
и все эти проблемы для себя выдумал и решил)
03:45:20 ПП
User 228403837
User 321317845
а указанием типа без указания пути?)
у меня это дефолтный ресолвер для типа
03:45:20 ПП
User 321317845
ладно, это не нужно
03:45:27 ПП
User 228403837
хотя походу я пока кидаю исключения
03:45:29 ПП
User 321317845
это для сериалайзеров нужно
03:45:51 ПП
User 228403837
я пока не определился нужны ли дефолтные ресолверы для типа или нет
03:45:56 ПП
User 321317845
у нас заработали они, так что можно указать какой тип в какой массив при каких аргументах будет превращаться
03:46:12 ПП
User 228403837
я хз, я пока не вижу в этом смысла
03:46:24 ПП
User 321317845
ты можешь из контроллеров возвращать модели
03:46:28 ПП
User 321317845
а не массивы
03:46:48 ПП
User 321317845
а в потомках при получении parent - получать эти самые модели
03:46:51 ПП
User 228403837
у меня цель простая:

 - очень простой инструмент с документацией которую можно прочитать полностью за 15 минут
 - схема и реализация схемы отдельно
 - за счет предыдущего пункта много доп плюшек которые с другими реализациями которые я рассматривал просто не сделать
03:47:06 ПП
User 228403837
User 321317845
ты можешь из контроллеров возвращать модели
ну я и так могу)
03:47:22 ПП
User 228403837
https://github.com/fesor/graphql/blob/master/tests/DefaultResolverTest.php
github.com/fesor/graphql/blob/master/tests/DefaultResolverTest.php
graphql - GraphQL for Symfony
03:48:14 ПП
User 321317845
не вижу
03:48:17 ПП
User 228403837
блин че ж я такая ленивая жопа... уже 10 раз мог бы дописать
03:48:18 ПП
User 321317845
везде строка возвращается
03:48:24 ПП
User 228403837
User 321317845
везде строка возвращается
....
03:48:29 ПП
03:48:29 ПП
User 228403837
смотри внимательнее)
03:48:40 ПП
User 228403837
ты не туда смотришь)
03:48:59 ПП
User 228403837
окей - ридми что-ли почитай
03:49:08 ПП
User 228403837
может там пример понятнее
03:49:28 ПП
User 228403837
короч.... я не знаю... все намного проще.... в целом средняя graphql api на symfony пилится за вечер
03:49:30 ПП
User 321317845
у тебя два провайдера
03:49:37 ПП
User 228403837
без всех этих мега убер пупер фреймворков
03:49:38 ПП
User 321317845
один фу возвращает, другой бар
03:49:45 ПП
User 228403837
....это тест
03:49:50 ПП
03:50:08 ПП
User 228403837
https://github.com/fesor/graphql/blob/master/tests/DefaultResolverTest.php#L43-L58
github.com/fesor/graphql/blob/master/tests/DefaultResolverTest.php
graphql - GraphQL for Symfony
03:50:19 ПП
User 228403837
это то что вернул parent resolver
03:50:25 ПП
User 228403837
и ты из этого хочешь заресолвить филд foo
03:50:28 ПП
User 228403837
и вот тебе варианты
03:50:41 ПП
03:50:48 ПП
User 321317845
это же дичь
03:50:57 ПП
User 228403837
....ты видимо не понял все же
03:51:02 ПП
User 321317845
ну т.е. получается что вернуть можно только дто
03:51:12 ПП
User 321317845
под моделью я имел ввиду энтити
03:51:12 ПП
User 228403837
....не понимаю почему ты делаешь такие выводы
03:51:15 ПП
User 228403837
ты очень странный
03:51:16 ПП
User 321317845
включая POPO
03:51:26 ПП
User 228403837
ну возвращай сущность, все будет работать)
03:51:40 ПП
User 228403837
почему только DTO?
03:51:41 ПП
User 321317845
ну так ты орниентируешься на сигнатуры методов
03:51:48 ПП
User 321317845
foo/getFoo
03:51:49 ПП
03:51:52 ПП
User 228403837
стандартный конвеншен
03:51:59 ПП
User 228403837
а что?
03:52:05 ПП
User 321317845
это уже дто
03:52:11 ПП
User 321317845
ну т.е. нет
03:52:15 ПП
User 228403837
в случае симфони 90% так сущности юзают
03:52:17 ПП
User 321317845
но это путь к анемичным моделям
03:52:21 ПП
User 321317845
ну это да
03:52:26 ПП
User 321317845
ладно, никаких проблем
03:52:36 ПП
User 228403837
User 321317845
но это путь к анемичным моделям
ну давай так, тот факт что ты сущности в UI layer пихаешь уже о многом говорит)
03:52:37 ПП
User 321317845
но я тебе говорил про то, что можно вернуть что угодно
03:52:47 ПП
User 228403837
и геттеры которые не юзаются в условиях - это не путь к анемичным моделям
03:52:49 ПП
User 321317845
а не строго заточенную сущность в стиле сонаты
03:52:56 ПП
User 228403837
User 321317845
но я тебе говорил про то, что можно вернуть что угодно
так ты можешь вернуть что угодно)
03:53:19 ПП
User 321317845
но оно тогда не поймёт
03:53:21 ПП
User 228403837
и если для конкретного "что угодно" ресолвер чуть более хитрый - ты можешь задефайнить для конкретного типа или конкретного поля конкретного типа свой ресолвер который все уточнит
03:53:31 ПП
03:53:38 ПП
User 228403837
а это - чисто дефолтный
03:53:47 ПП
User 228403837
и он, скажу я тебе, покрывает где-то 80% нужд
03:53:49 ПП
User 321317845
а я тебе говорил о том, что у меня есть возможность вообще без этого обходиться
03:53:54 ПП
User 321317845
даже с хитрыми моделями
03:54:03 ПП
User 228403837
давай придумаем проект пример
03:54:08 ПП
User 228403837
для демонстрации "как юзать"
03:54:23 ПП
User 228403837
я думаю это будет полезно
03:55:00 ПП
User 321317845
class User
{
    public function getCredentials(): Credentials { ... }
}
type User {
  name: String
  login: String!
  email:Email!
}
03:55:05 ПП
User 321317845
вот тебе пример типичный)
03:55:26 ПП
User 228403837
ммм.... и?
03:55:38 ПП
User 228403837
ну то есть окей
03:55:43 ПП
User 321317845
ну придётся писать кастомный резолвер
03:55:47 ПП
User 228403837
моя штука тут обкакается если ты свой ресолвер на это дело не сделаешь
03:55:57 ПП
User 321317845
причём в качестве парента потомка тебе прилетит что?
03:55:57 ПП
User 228403837
а ты как будешь разруливать? элиасы?
03:56:02 ПП
User 321317845
правильно, массив, а не объект User
03:56:20 ПП
User 228403837
User 321317845
правильно, массив, а не объект User
не массив а VO
03:56:23 ПП
User 228403837
а.... ну да
03:56:25 ПП
User 228403837
хз короч
03:56:37 ПП
User 228403837
вообще нет
03:56:44 ПП
User 228403837
для login и email мне придет инстанс User
03:56:51 ПП
User 321317845
ну т.е. я это проходил ещё год назад, когда с фолклор развлекался
03:57:09 ПП
User 321317845
User 228403837
для login и email мне придет инстанс User
хм, ну тогда это круто =)
03:57:53 ПП
User 321317845
в моём варианте можно получить и массив и модель и даже коллекцию всех элементов, что были в родителе
04:00:06 ПП
User 321317845
короче, это надо показывать
04:00:19 ПП
User 228403837
ну вот придумай проект пример с такими штуками)
04:00:21 ПП
User 321317845
но с дефолтными get\set - это норм идея, если они опциональны
04:00:24 ПП
User 321317845
стырю идею +)
04:00:26 ПП
04:00:29 ПП
User 228403837
вжопу сеттеры
04:00:34 ПП
User 321317845
та пофигу
04:00:37 ПП
User 321317845
ты понял о чём я)
04:00:48 ПП
User 321317845
сериалайзеры поверх геттеров
04:01:02 ПП
User 321317845
User 228403837
ну вот придумай проект пример с такими штуками)
а что придумывать
04:02:03 ПП
User 228403837
а ты видел как в webonyx сделали?
04:02:07 ПП
User 321317845
вечером напомни мне я апну апишку
04:02:09 ПП
User 228403837
я просто сгорел
04:02:55 ПП
User 228403837
$value = $data->$field;
if ($value instanceof \Closure) {
    $value($requestInfo);
}
04:03:07 ПП
User 228403837
ну то есть втупую копипаста с js где можно по полю достать функцию
04:03:13 ПП
User 228403837
в php это не практикуется (неудобно)
04:03:22 ПП
User 228403837
и обычно нужны методы
04:03:28 ПП
User 228403837
я ржал минут 5
04:03:31 ПП
User 228403837
когда увидел
04:04:59 ПП
User 321317845
видел
04:05:04 ПП
User 321317845
по-этому и матерился)
04:05:16 ПП
User 321317845
так же как от фолклора
04:05:25 ПП
User 321317845
там вообще на методы переделали
04:05:40 ПП
User 321317845
вроде fieldNameResolver(....) { }
04:06:05 ПП
User 321317845
фолклор - это вот это: https://github.com/Folkloreatelier/laravel-graphql
github.com/Folkloreatelier/laravel-graphql
Facebook GraphQL for Laravel 5. It supports Relay, eloquent models, validation and GraphiQL. - Folkloreatelier/laravel-graphql
04:11:13 ПП
User 321317845
User 228403837
я просто сгорел
а ты видел вообще JS реализацию?)))
04:11:20 ПП
User 321317845
я рыдал
04:11:24 ПП
User 321317845
это такая дичь
04:11:42 ПП
User 321317845
там лексер+парсер вперемешку и на ифчиках всё
04:12:01 ПП
User 321317845
а самое весёлое - вообще никаких проверок
04:12:25 ПП
User 321317845
ну т.е. только некоторая часть и только на тех же самых ифчиках
04:13:29 ПП
User 321317845
помнится я хотел скопипсатить сообщеньки об ошибках и решил заимплементировать не интерфейс, а другой тип
04:13:47 ПП
User 321317845
а оно ничего мне не сказало, только когда запрос сделал - внутренности вывалились)
04:28:40 ПП
User 228403837
User 321317845
там лексер+парсер вперемешку и на ифчиках всё
ну так фронтендеры делали
04:28:52 ПП
User 228403837
на самом деле мне дико не нравится реализация graphql на запись
04:29:06 ПП
User 228403837
я считаю что это типа "мы много думали как сделать на чтение а на запись нам было пофиг"
04:30:25 ПП
User 321317845
User 228403837
на самом деле мне дико не нравится реализация graphql на запись
это в gql вообще ничем не отличается
04:30:43 ПП
User 321317845
мне не нравится что query+mutations захардкожены
04:30:54 ПП
User 321317845
это связанная проблема
04:31:16 ПП
User 321317845
По-хорошему их вообще не стоит ограничивать.
04:32:08 ПП
User 321317845
Есть какая-то дефолтная схема, которая является эндпоинтом для опущенного типа запроса. Могли бы назвать её default
04:32:19 ПП
User 321317845
а остальное сделать просто зависимым от типа запроса
04:32:56 ПП
User 321317845
query { ... }
mutation { ... }
admin { ... }
subscription { .... }
ololo { ... }
04:33:10 ПП
User 321317845
это уже не суть важно должно быть и ориентировано только на то, что указано в схеме, а не на те имена, которые закостылены в стандарте
04:34:15 ПП
User 321317845
отсюда и трабла с апдейтами, ибо они семантически разделены, а по-факту ничем не отличаются от запросов
04:34:34 ПП
User 228403837
User 321317845
По-хорошему их вообще не стоит ограничивать.
да да
04:35:20 ПП
User 321317845
и есть подозрение, что вот это лучше было бы:
type Users {
  find(id: ID!): User
  update(id: ID!, user: UserInput!): User!
}
04:35:53 ПП
User 321317845
ну не лучше, но допустимо и читаемо, нежели в текущем варианте
04:36:33 ПП
User 321317845
@fes0r или ты под апдейтами имел ввиду отдельный инпут тип?