Понятия State Providers и State Processors

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

Если мы перейдем с вами в документацию API Platform, перейдем в раздел Core.

https://api-platform.com/docs/core/state-providers/

https://api-platform.com/docs/core/state-processors/

Здесь мы с вами можем увидеть два таких важных раздела: State Providers и State Processors. Для нас сейчас самое главное понять, что это за сущности и каким образом нам с ними можно взаимодействовать, то есть для чего они вообще создавались. Давайте подробнее остановимся на этом вопросе. 

Теневая сторона API Platform

Итак, когда мы с вами установили API Platform и начинаем делать запросы к каким-то сущностям, которые есть в этой API платформе, у нас происходит какая-то магия. Мы делаем запрос, и к нам приходят уже готовые данные. Какие процессы стоят за всеми этими операциями между отправкой запроса и получением уже готового ответа? 

Вот эта теневая сторона, за эту теневую сторону, как раз таки отвечают два таких определения: State providers и State processors.

Слово "State" означает состояние и, соответственно, означает то, что мы делаем что-то с нашим состоянием, состоянием нашего элемента сущности. 

Состояние можно каким-то образом изменять, добавлять туда новые элементы, получать элементы, обновлять, удалять и так далее. И когда мы делаем какие-то запросы к сущности, которые находятся в базе данных, в зависимости от того запроса, который мы с вами сделаем, эта теневая сторона, которая будет обрабатывать данные, она будет иметь дело либо с сущностью State providers, либо сущностью State processors.

Что значит Providers? 

Providers - это то, что обеспечивает нам данные. Точно также и здесь State providers - это некая сущность API платформы, которая выдаёт нам данные, когда мы выполняем Get запрос, либо запрос Get Collection на выборку большого массива данных мы имеем дело с State providers. 

Что значит Processors?

А когда мы с вами выполняем запросы Patch, Post, Delete, то есть добавить какую-то запись, обновить какую-то запись, удалить какую-то запись, в этот момент API платформа взаимодействует со State processors.

По сути, обе эти сущности представляют собой определённые PHP классы. Для каждой из операций get, getCollection, Post, Patch, Delete существуют определенные PHP классы, которые содержат некую логику, которая будет подготавливать нам те данные, которые нам а платформа будет подготавливать. 

Преимущество в том, что мы с вами можем взять какой-то любой из этих PHP классов, которые отвечают за предоставление данных, либо за добавление данных, и каким-то образом их дополнить, либо видоизменить, чтобы происходили какие-то действия в момент их выполнения.

Примеры использования

Если мы хотим каким-то образом видоизменить те данные, которые приходят нам в ответе от сервера, в этом случае нам понадобятся State Providers, и мы должны расширить вот эти вот два класса Get и Get Collection. 

В каких случаях это может пригодиться? Например, у вас приходит некий контент, который нужно вывести на странице. Из этого контента нужно просто удалить какие-то определённые символы, например, HTML разметку, чтобы вывелось как обычный текст. В этом случае мы используем йт провайдеры, чтобы модифицировать ответ, который приходит к нам от API Platform.

Либо, если нам нужно какие-то данные наоборот добавить в этот ответ. Мы точно также можем использовать State Providers в этом случае. 

Когда мы выполняем запросы Post, Patch или Delete, в этих случаях мы должны с вами воспользоваться State Processors и добавить туда какую-то нашу логику, которая будет выполняться в момент этих запросов.

Например, частая задача - нужно шифровать пароль прежде, чем добавить его в базу данных. C помощью State Processors - эта задача легко решается. Такое хэширование паролей будет производиться в middleware (которые в данном случае являются State Processors), то есть такой прослойкой между базой данных и вашим кодом, который у вас используется.

Важный момент, когда мы с вами делаем API ресурс из сущности, которая у нас, например, хранится в базе данных, мы с вами автоматически получаем встроенные State Providers и State Processors. Отсюда происходит такая магия, что мы делаем какой-то запрос и автоматически получаем нужный набор данных, и нам ничего не нужно настраивать.

Создание собственных Providers и Processors

Но кроме того, мы можем создавать какие-то свои State Providers и State Processors, которые позволят нам получать данные не только сущности, которая хранится у нас в базе данных. Например, это может быть запросы к сторонним API. То есть в стороннем API есть какие-то элементы, которые мы можем получать, мы можем сделать для них свои endpoints в API Platform. 

Либо если у вас данные хранятся в CSV файле и вам нужно создать некую такую прослойку, которая будет с этим файлом взаимодействовать, как с API, то вы можете создать свои провайдеры и процессоры и соответственно у вас будет некий элемент сущности, который будет взаимодействовать с этим CSV файлом. Так, вы можете создать некую API платформу файла.

Кроме того, часто это может использоваться системой поиска, то есть система поиска может тоже быть как API. Благодаря этим двум сущностям, мы можем таким образом любой источник данных, который у нас есть, преобразовать в виде API, который будет доступен в нашей API платформе. 

Вот такая вот важная идея, которую нужно понять, прежде чем мы с вами приступим к практическим действиям по изучению этих важных двух понятий.

Итак, давайте будем приступать и знакомиться с ними более подробно.