Π‘Π»ΠΎΠ³

πŸ€” ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½ΠΎΠ²Ρ‹ΠΉ Gato GraphQL Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠ» 1,5 Π³ΠΎΠ΄Π°?

Leonardo Losoviz
Автор: Leonardo Losoviz Β·

ВСрсия 0.9 Gato GraphQL Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π²Ρ‹ΡˆΠ»Π°. На ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΡƒ ΡƒΡˆΠ»ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ 1,5 Π³ΠΎΠ΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ Π±ΠΎΠ»Π΅Π΅ 16 000 ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ². Π­Ρ‚ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»Π³ΠΎ!

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ я подСлился анонсом Π½Π° Hacker News, ΠΌΠ½Π΅ Π·Π°Π΄Π°Π»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ вопрос:

[...] МнС интСрСсно ΡƒΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎ 16k ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ². ΠŸΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… я участвовал, с Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π΄Π΅ΡΡΡ‚ΡŒΡŽ тысячами ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ΠΈΠΌΠ΅Π»ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ дСсятки ΠΈΠ»ΠΈ сотни людСй, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ»Π½Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ дСнь. [...] Π•ΡΡ‚ΡŒ Π»ΠΈ какая-Ρ‚ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Ρ‚ΡŒ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π² постС Π½Π΅ говорится?

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² β€” Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ надёТная ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ я ΠΌΠΎΠ³Ρƒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ простоС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈ Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΌΠΈΡ‚. МногиС ΠΈΠ· этих 16k ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π±Ρ‹Π»ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌΠΈ "typo" ΠΈΠ»ΠΈ просто ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ΠΌ описания Π² ΠΊΠ°ΠΊΠΎΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ README.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ количСство ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π΄Π°Ρ‘Ρ‚ прСдставлСниС ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… усилиях. Π‘Ρ‹Π»ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΌΠ°Π»ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ², Π½Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… измСнСниями, Π²ΠΊΠ»ΡŽΡ‡Π°Π²ΡˆΠΈΡ… дСсятки ΠΈ Π΄Π°ΠΆΠ΅ сотни ΠΏΡ€Π°Π²ΠΎΠΊ Π·Π° Ρ€Π°Π·. ИзмСнСния ΠΌΠ΅ΠΆΠ΄Ρƒ вСрсиями 0.8 ΠΈ 0.9 Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹, ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΈΡΡŒ усилия ΠΈ врСмя.

Π’ этой записи Π±Π»ΠΎΠ³Π° я ΠΎΠΏΠΈΡˆΡƒ, Ρ‡Ρ‚ΠΎ это Π·Π° измСнСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это заняло Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. И, дСлая это, я Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π°ΠΌ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±Π·ΠΎΡ€ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Ρ… возмоТностСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π² ΠΊΠΎΠ΄ΠΎΠ²ΡƒΡŽ Π±Π°Π·Ρƒ ΠΈ увидят свСт Π² прСдстоящСй вСрсии 1.0.

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ GraphQL-сСрвСра

Для Π½Π°Ρ‡Π°Π»Π° подСлюсь Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ историСй Π΄Π²ΠΈΠΆΠΊΠ° ΠΈ тСхничСскими дСталями Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

(Π­Ρ‚ΠΎ Π² основном Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²; Ссли вас Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚ тСхничСскиС подробности, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Ρ€Π°Π·Π΄Π΅Π»Ρƒ.)

Gato GraphQL основан Π½Π° PoP β€” Π΄Π²ΠΈΠΆΠΊΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π½Π° PHP (Π°Π½Π°Π»ΠΎΠ³ React ΠΈΠ»ΠΈ Vue Π½Π° JavaScript). Π•Π³ΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ этого Π΄Π²ΠΈΠΆΠΊΠ° Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Π°, поэтому ΠΏΠ»Π°Π³ΠΈΠ½ Ρ€Π°Π·ΠΌΠ΅Ρ‰Ρ‘Π½ Π² ΠΌΠΎΠ½ΠΎΡ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ GatoGraphQL/GatoGraphQL Π½Π° GitHub.

Под ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ эта Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Gato GraphQL Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ GraphQL-запрос, сначала прСобразуя Π΅Π³ΠΎ Π² ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΡƒΡŽ модСль ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ PoP Π·Π°Ρ‚Π΅ΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚, получая всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, Π° Π·Π°Ρ‚Π΅ΠΌ этим Π΄Π°Π½Π½Ρ‹ΠΌ придаётся Ρ„ΠΎΡ€ΠΌΠ° GraphQL-запроса.

Когда я Π½Π°Ρ‡Π°Π» Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π°Π΄ PoP ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² 2013/2014 Π³ΠΎΠ΄Ρƒ, GraphQL Π΅Ρ‰Ρ‘ Π½Π΅ сущСствовал, ΠΈ мСтодология Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π² Π΄Π°Π½Π½Ρ‹Π΅ Π±Ρ‹Π»Π° спроСктирована ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° с нуля. ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ для подраТания (Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ GraphQL для ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ ΠΈ эталонный ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ graphql-js для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ) Π±Ρ‹Π»ΠΎ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ ΠΏΠΎΠΌΠ΅Ρ…ΠΎΠΉ, ΠΈ Π±Π»Π°Π³ΠΎΠΌ, ΠΊΠ°ΠΊ я объясню ΠΏΠΎΠ·ΠΆΠ΅.

PoP ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π±Ρ‹Π» спроСктирован для Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° всСго Π²Π΅Π±-сайта Π² Π²ΠΈΠ΄Π΅ HTML Π½Π° сторонС сСрвСра, ΠΏΡ€ΠΈ этом прСдоставляя сырыС Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ?output=json ΠΊ URL страницы, с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ (настройки, Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π‘Π”), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ URL.

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ссылкам (всС ΠΎΠ½ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Π²Π΅Π±-страницу, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ URL) ΠΈ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° различия:

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΏΠΎ послСднСй ссылкС ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ осознаниС: это практичСски GraphQL! ЕдинствСнноС большоС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΎΡ‚Π²Π΅Ρ‚Π΅ нСявны β€” ΠΎΠ½ΠΈ ΡƒΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ (Π½Π° PHP), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π½Π° страницу. GraphQL ΠΆΠ΅ позволяСт Π½Π°ΠΌ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ запроса.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, ΠΊΠΎΠ³Π΄Π° я ΡƒΠ·Π½Π°Π» ΠΎ GraphQL ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² 2019 Π³ΠΎΠ΄Ρƒ, для мСня Π±Ρ‹Π»ΠΎ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ PoP Ρ‚ΠΎΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ‚Π°Ρ‚ΡŒ GraphQL-сСрвСром. Всё, Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, β€” ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ GraphQL-запрос Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π½Π° Π»Π΅Ρ‚Ρƒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ модСль ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π½Π° основС запроса.

И это ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я сдСлал. И это Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ. Но Π±Ρ‹Π»ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ PoP ΠΏΠΎΠ½ΠΈΠΌΠ°Π» собствСнный Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, поэтому GraphQL-запрос ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρƒ PoP:

  1. Π Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ GraphQL-запрос; Π·Π°Ρ‚Π΅ΠΌ
  2. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ запрос Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ PoP; Π·Π°Ρ‚Π΅ΠΌ
  3. Π Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ PoP

Π Π°Π·Π±ΠΎΡ€ GraphQL-запроса Ρ‚ΠΎΠ³Π΄Π° выполнялся Π΄Π²Π°ΠΆΠ΄Ρ‹ (ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для GraphQL, ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для PoP), Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ PoP Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π»ΡΡ Ρ‡Π΅Ρ€Π΅Π· AST, Π° просто посрСдством ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π±ΠΎΡ€Π° строки запроса снова ΠΈ снова. (ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ AST Π±Ρ‹Π»ΠΎ уТасным ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, Π½ΠΎ Ρƒ мСня Π½Π΅ Π±Ρ‹Π»ΠΎ спСцификации для слСдования, ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° происходила органичСски, Π³Π΄Π΅ простой substr(...) Ρ€Π΅ΡˆΠ°Π» ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ дСнь.)

Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ я Π³ΠΎΠ²ΠΎΡ€ΡŽ, Ρ‡Ρ‚ΠΎ отсутствиС спСцификации GraphQL Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΌΠ΅Ρ…ΠΎΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠΎΡ‘ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΌ (ΠΈ Ρ‚Π°ΠΊΠΈΠΌ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π΅Π» Π² вСрсии 0.8). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ я Ρ€Π΅ΡˆΠΈΠ» это ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ.

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π²ΠΈΠΆΠΊΠ° Π² GraphQL-first

РСшСниС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ я остановился, β€” Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ PoP Π½Π°Ρ‚ΠΈΠ²Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с языком GraphQL. Π’ΠΎΠ³Π΄Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° GraphQL-запроса Π² PoP Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΡƒΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π° Π² модСль ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Π±Π΅Π· нСобходимости ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ΠΎΠ² ΠΈΠ»ΠΈ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π»ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ PoP Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ: ΠΈΠ· PHP-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, которая Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ»Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ для Π²Π΅Π±-сайтов Π½Π° сторонС сСрвСра ΠΈ Π±Ρ‹Π»Π° Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π° для Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ GraphQL-запросов, ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Π»Π° ΡΡ‚Π°Ρ‚ΡŒ настоящим GraphQL-сСрвСром.

Кодовая Π±Π°Π·Π° ΠΏΡ€Π΅Ρ‚Π΅Ρ€ΠΏΠ΅Π»Π° ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹Π΅ прСобразования: GraphQL AST стал основой для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ состояния ΠΌΠ΅ΠΆΠ΄Ρƒ всСми PHP-сСрвисами Π² Π΄Π²ΠΈΠΆΠΊΠ΅. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ GraphQL AST Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ для PoP (вмСсто строк запросов).

Π”Ρ€ΡƒΠ³ΠΈΠ΅ GraphQL-сСрвСры Π½Π° PHP ΠΎΠΏΠΈΡ€Π°ΡŽΡ‚ΡΡ Π½Π° graphql-php, Π½ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½ Gato GraphQL β€” Π½Π΅Ρ‚. Π­Ρ‚ΠΎ плохая Π½ΠΎΠ²ΠΎΡΡ‚ΡŒ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния усилий Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ я Π½Π΅ ΠΌΠΎΠ³Ρƒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π» ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ), Π½ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ Π½ΠΎΠ²ΠΎΡΡ‚ΡŒ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния нСзависимости: я ΠΌΠΎΠ³Ρƒ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ, Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΌΠΎΠΉ ΠΏΠ»Π°Π³ΠΈΠ½ Π² своём собствСнном Ρ‚Π΅ΠΌΠΏΠ΅ ΠΈ ΠΏΠΎ собствСнному ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ (ΠΈΠΌΠ΅Π½Π½ΠΎ поэтому ΠΏΠ»Π°Π³ΠΈΠ½ ΡƒΠΆΠ΅ прСдоставляСт Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Β«oneofΒ»).

И, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Π½ΠΈΠΆΠ΅, это большоС прСимущСство.

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй Π² GraphQL

GraphQL ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ассоциируСтся с ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…. РазумССтся, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ (посты, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΈ Ρ‚. Π΄.) ΠΈΠ· Gato GraphQL:

query {
  posts(
    pagination: { limit: 5, offset: 20 }
    sort: { by: DATE, order: ASC }
  ) {
    id
    title
    content
    url
    author {
      id
      name
      url
    }
    comments {
      id
      date
      content
    }
  }
}

Но это Π½ΠΈΠ·ΠΊΠΎ висящий ΠΏΠ»ΠΎΠ΄. GraphQL Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°Π΄Π°Ρ‡, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΡΡ†ΠΈΡŽ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ Π΄Π°ΠΆΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ GraphQL Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π΅ для посрСдничСства ΠΌΠ΅ΠΆΠ΄Ρƒ сСрвисами.

Π’ΠΎΡ‚ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², Π³Π΄Π΅ GraphQL ΠΏΠΎΠ»Π΅Π·Π΅Π½:

  • Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… источников (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ с сайтов WordPress ΠΈ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… рассылки ΠΈΠ· Mailchimp), объСдинСниС Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΈΡ… совмСстный Π°Π½Π°Π»ΠΈΠ· ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ…
  • Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ для Π°Π΄Π°ΠΏΡ‚Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° Π½Π° сайтС:
    • Π•Π΄ΠΈΠ½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΈ пСрСносС сайта Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π΄ΠΎΠΌΠ΅Π½ ΠΈ Π·Π°ΠΌΠ΅Π½Π΅ "www.myoldsite.com" Π½Π° "mynewsite.com" Π²Π΅Π·Π΄Π΅ Π² ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π΅ ΠΈ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ…
    • На постоянной основС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для Π·Π°ΠΌΠ΅Π½Ρ‹ любого "http://" Π½Π° "https://" ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ поста Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ
  • ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Google Translate API для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° всСх записСй Π±Π»ΠΎΠ³Π° Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ язык
  • АвтоматичСская публикация Ρ‚Π²ΠΈΡ‚Π° послС ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ записи Π² Π±Π»ΠΎΠ³Π΅

PoP Π±Ρ‹Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ этих Π΄Ρ€ΡƒΠ³ΠΈΡ… сцСнариСв использования посрСдством Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ (СстСствСнно) Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ GraphQL, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ:

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠΎΠ»Π΅ΠΉ Β«Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈΒ» (Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ полям Β«Π΄Π°Π½Π½Ρ‹Ρ…Β»), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎ всСм Ρ‚ΠΈΠΏΠ°ΠΌ Π² схСмС
  • ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ поля Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ полю Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ запросС
  • Компоновка Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ΄Π½Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° измСняла ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹
  • ДинамичСскоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΈΠ»ΠΈ Π½Π΅Ρ‚, основанноС Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ поля

И я ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π» ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· GraphQL-сСрвСра: я ΡƒΠΆΠ΅ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π» ΠΈΡ…, ΠΈ ΠΎΠ½ΠΈ бСзусловно Ρ†Π΅Π½Π½Ρ‹.

Π˜Ρ‚Π°ΠΊ, вторая ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ v0.9 заняла Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π°ΠΉΡ‚ΠΈ способ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ эти Π½ΠΎΠ²Ρ‹Π΅ возмоТности Π² GraphQL Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ GraphQL (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… элСмСнтов Π² синтаксис GraphQL Π±Ρ‹Π»ΠΎ Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎ).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ манипуляции Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² GraphQL

НовыС возмоТности, Π²Π²Π΅Π΄Ρ‘Π½Π½Ρ‹Π΅ Π² GraphQL Π² ΠΏΠ»Π°Π³ΠΈΠ½Π΅, станут Π±ΠΎΠ»Π΅Π΅ Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΌΠΈ Π² блиТайшСм Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ вСрсия 1.0. Но Π²Ρ‹ ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‰ΡƒΡ‚ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ….

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ GraphQL-запрос ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ список ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… записСй ΠΈΠ· внСшнСго REST API (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ @remove-ΠΈΡ‚ΡŒ ΠΈΠ· ΠΎΡ‚Π²Π΅Ρ‚Π°); ΠΏΠΎΠ΄Π°Ρ‘Ρ‚ эти Π΄Π°Π½Π½Ρ‹Π΅ Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΏΠΎΠ»Π΅ прямо Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ запросС; ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ свойство email ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠΉ записи; ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ† ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ email Π² Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ рСгистр, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли язык Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ записи β€” английский ΠΈΠ»ΠΈ Π½Π΅ΠΌΠ΅Ρ†ΠΊΠΈΠΉ:

###################################################################
# Fetch data from a REST endpoint, extract the emails, and make
# uppercase those ones from users with a special language.
###################################################################
query ExtractEmailsFromAPIAndUpperCaseSpecialOnes
{
  # Retrieve data from a REST API endpoint
  userEntries: _sendJSONObjectCollectionHTTPRequest(
    input: {
      url: "https://newapi.getpop.org/wp-json/newsletter/v1/subscriptions"
    }
  ) # @remove   # <= Uncomment this directive to not print the API data
 
  emails: _echo(value: $__userEntries)
 
    # Iterate all the entries, passing every entry
    # (under the dynamic variable $userEntry)
    # to each of the next 4 directives
    @underEachArrayItem(
      passValueOnwardsAs: "userEntry"
      affectDirectivesUnderPos: [1, 2, 3, 4]
    )
 
      # Extract property "lang" from the entry
      # via the functionality field `_objectProperty`,
      # and pass it onwards as dynamic variable $userLang
      @applyField(
        name: "_objectProperty"
        arguments: {
          object: $userEntry,
          by: {
            key: "lang"
          }
        }
        passOnwardsAs: "userLang"
      )
 
      # Execute functionality field `_inArray` to find out
      # if $userLang is either "en" or "de", and place the
      # result under dynamic variable $isSpecialLang
      @applyField(
        name: "_inArray"
        arguments: {
          value: $userLang,
          array: ["en", "de"]
        }
        passOnwardsAs: "isSpecialLang"
      )
 
      # Extract property "email" from the entry
      # and set it back as the value for that entry
      @applyField(
        name: "_objectProperty"
        arguments: {
          object: $userEntry,
          by: {
            key: "email"
          }
        }
        setResultInResponse: true
      )
 
      # If $isSpecialLang is `true` then execute
      # directive `@strUpperCase` 
      @if(condition: $isSpecialLang)
        @strUpperCase
}

Π’ΠΎΡ‚ ΠΎΡ‚Π²Π΅Ρ‚ (ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ email Π±Ρ‹Π»ΠΈ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Ρ‹ Π² Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ рСгистр):

{
  "data": {
    "userEntries": [
      {
        "email": "abracadabra@ganga.com",
        "lang": "de"
      },
      {
        "email": "longon@caramanon.com",
        "lang": "es"
      },
      {
        "email": "rancotanto@parabara.com",
        "lang": "en"
      },
      {
        "email": "quezarapadon@quebrulacha.net",
        "lang": "fr"
      },
      {
        "email": "test@test.com",
        "lang": "de"
      },
      {
        "email": "emilanga@pedrola.com",
        "lang": "fr"
      }
    ],
    "emails": [
      "ABRACADABRA@GANGA.COM",
      "longon@caramanon.com",
      "RANCOTANTO@PARABARA.COM",
      "quezarapadon@quebrulacha.net",
      "TEST@TEST.COM",
      "emilanga@pedrola.com"
    ]
  }
}

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ сами! НаТмитС ΠΊΠ½ΠΎΠΏΠΊΡƒ Β«RunΒ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ запрос:

###################################################################
# Fetch data from a REST endpoint, extract the emails, and make
# uppercase those ones from users with a special language.
###################################################################
query ExtractEmailsFromAPIAndUpperCaseSpecialOnes {
  # Retrieve data from a REST API endpoint
  userEntries: _sendJSONObjectCollectionHTTPRequest(
    input: {
      url: "https://newapi.getpop.org/wp-json/newsletter/v1/subscriptions"
    }
  )
  # @remove   # <= Uncomment this directive to not print the API data
  emails: _echo(value: $__userEntries)
    # Iterate all the entries, passing every entry
    # (under the dynamic variable $userEntry)
    # to each of the next 4 directives
    @underEachArrayItem(
      passValueOnwardsAs: "userEntry"
      affectDirectivesUnderPos: [1, 2, 3, 4]
    )
      # Extract property "lang" from the entry
      # via the functionality field `_objectProperty`,
      # and pass it onwards as dynamic variable $userLang
      @applyField(
        name: "_objectProperty"
        arguments: { object: $userEntry, by: { key: "lang" } }
        passOnwardsAs: "userLang"
      )
      # Execute functionality field `_inArray` to find out
      # if $userLang is either "en" or "de", and place the
      # result under dynamic variable $isSpecialLang
      @applyField(
        name: "_inArray"
        arguments: { value: $userLang, array: ["en", "de"] }
        passOnwardsAs: "isSpecialLang"
      )
      # Extract property "email" from the entry
      # and set it back as the value for that entry
      @applyField(
        name: "_objectProperty"
        arguments: { object: $userEntry, by: { key: "email" } }
        setResultInResponse: true
      )
      # If $isSpecialLang is `true` then execute
      # directive `@strUpperCase`
      @if(condition: $isSpecialLang)
        @strUpperCase
}

Π― ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π», Ρ‡Ρ‚ΠΎ отсутствиС ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ² Π² Π²ΠΈΠ΄Π΅ GraphQL Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΌΠ΅Ρ…ΠΎΠΉ, Π½ΠΎ (Π² рСтроспСктивС) Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ Π±Π»Π°Π³ΠΎΠΌ. Π­Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Ρƒ мСня Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ спСцификации GraphQL, ΠΈ поэтому я ΠΌΠΎΠ³ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ сСбС ΠΌΠ΅Ρ‡Ρ‚Π°Ρ‚ΡŒ ΠΎΠ± этих Π½ΠΎΠ²Ρ‹Ρ… возмоТностях.

И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Ρ‹Π»ΠΈ пСрСнСсСны Π² Gato GraphQL, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ нСвСроятно ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ союзником для всСго, Ρ‡Ρ‚ΠΎ связано с ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ, манипуляциСй ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° для вашСго сайта WordPress. (Π₯отя ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² прСдстоящСй v1.0.)

Заняло Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя, Π½ΠΎ усилия Ρ‚ΠΎΠ³ΠΎ явно стоили.

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅!

УбСдились, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»Π³ΠΎΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ стоило? НадСюсь, Ρ‡Ρ‚ΠΎ Π΄Π°!

Π”Π°Π²Π°ΠΉΡ‚Π΅, скачайтС ΠΏΠ»Π°Π³ΠΈΠ½ ΠΈ посмотритС:

Π₯ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ новости ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, Π½ΠΎΠ²ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΈ анонсы прСдстоящих Ρ€Π΅Π»ΠΈΠ·ΠΎΠ², Π²ΠΊΠ»ΡŽΡ‡Π°Ρ v1.0? Π”ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ β€” ΠΏΠΎΠ΄ΠΏΠΈΡˆΠΈΡ‚Π΅ΡΡŒ Π½Π° рассылку.

Π₯ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ исходный ΠΊΠΎΠ΄ Π½Π° GitHub? ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ GatoGraphQL/GatoGraphQL (ΠΈ смСло ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π·Π²Π΅Π·Π΄Ρƒ... ΠœΡ‹ любим Π·Π²Ρ‘Π·Π΄Ρ‹! ⭐️⭐️⭐️)

ΠšΡΡ‚Π°Ρ‚ΠΈ, ΠΊΠ°ΠΊΠΈΠ΅ прСобразования ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π² WordPress (для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ спСциализированный коммСрчСский ΠΏΠ»Π°Π³ΠΈΠ½)? ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΌΠ½Π΅ сообщСниС с описаниСм вашСго случая использования.

Если Π²Π°ΠΌ нравится Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, поТалуйста, ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅ΡΡŒ с Π΄Ρ€ΡƒΠ·ΡŒΡΠΌΠΈ ΠΈ ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌΠΈ, ΠΏΠΎΠΌΠΎΠ³ΠΈΡ‚Π΅ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ любовь ❀️.


ΠŸΠΎΠ΄ΠΏΠΈΡˆΠΈΡ‚Π΅ΡΡŒ Π½Π° Π½Π°ΡˆΡƒ рассылку

Π‘ΡƒΠ΄ΡŒΡ‚Π΅ Π² курсС всСх ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ Gato GraphQL.