Symfony. Создание API-платформы.

Получите доступ ко всему, что можно найти на этом сайте.

1 мес. 1 год
≈1000 руб. ≈3600 руб. (-80%)

Ссылки для оплаты доступны после регистрации и входа на сайт.

Курс по основам работы с API здесь.

Дополнения:

Как работать с фильтрами API Platform:

https://webkyrs.info/category/symfony-api-platform-filtry

Если вам нужно разработать или доработать проект на Symfony, можете воспользоваться моими услугами.

Создание endpoint на Symfony без сторонних инструментов


Создание endpoint на Symfony без сторонних инструментов (решение в 1 строку)


Сериализация Symfony сущности и вывод только нужных полей


Делаем Symfony сущность доступной по API


Выполняем первые запросы к API endpoint без программного кода.


Как получать отладочную информацию по каждому запросу


Ограничиваем возможные методы для обращения к сущности


Подготовка страницы для фронтенд запросов к API Platform


Получаем список всех элементов сущности с помощью jQuery


Получаем список всех элементов сущности с помощью Axios


Получаем элемент сущности по id


Добавляем элементы с помощью библиотеки jQuery


Добавляем элементы с помощью библиотеки axios


Обновление значений в базе данных методами put и patch


Удаляем записи из базы данных


Взаимодействие с Get методами из адрестной строки браузера


Альтернативный способ ограничить возможные методы для обращения к endpoint


Как изменить название сущности в роутах API Platform


Откуда API-платформ берет поля.


Как ограничить выдаваемые поля от API Platform


Как изменять название свойств, которые выдаются в API Platform


Система постраничной навигации в API Platform


Настройки API-platform


Выдаем ответ в формате csv


Валидация полей для api platform


Создаем связь между сущностями и пытаемся получить такой элемент в API Platform


Создаем связь между сущностями и пытаемся получить такой элемент в API Platform. Продолжение


Как получать поля связанной сущности


Получаем поля в связанной сущности


Сортировка элементов в выдаче


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


Закрываем доступ к сущности для ролей и права владельца


Создаем класс State Processor


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


Изменение данных API Platform в подписчике событий


Как убрать какое-то поле объекта из выдачи API Platform

Что еще добавить в этот курс? Каких уроков вам не хватило?

Автор: Vasiliy Bulykin 12/05/2023 05:05:34

а как на symfony сделать публичный api, который был бы доступен с любых других доменов? уже пару дней бьюсь, и никак не могу победить CORS ошибку.

Access to XMLHttpRequest at 'https://127.0.0.1:8000/api/user' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

Автор: Дмитрий Ченгаев 13/05/2023 12:05:35

Можно попробовать через подписчики событий

https://webkyrs.info/page/kak-poluchat-i-modifitsirovat-dannie-otveta-v-podpischike-na-sobitiya

подписаться на события ответа и добавить с помощью конструкции if для нужных сущностей заголовок

$response->headers->set('Access-Control-Allow-Origin', '*');

Есть еще такой бандл
https://symfony.com/bundles/NelmioCorsBundle/current/index.html

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

Готового решения, к сожалению, нет у меня.

Автор: Vasiliy Bulykin 14/05/2023 12:05:57

ну да. оказалось, что в самом простом варианте — достаточно вставить 2 заголовка прям перед возвратом респонса, и всё заработало

вот эти:
$response->headers->set('Access-Control-Allow-Origin', '*');
$response->headers->set('Access-Control-Allow-Headers', 'Content-Type');

Автор: Nikolay T 16/04/2023 03:04:06

Дмитрий, курс супер, коротко и по делу! Единственное, хотелось бы увидеть такие темы, как Dto, Data Transformer, Data Provider. Спасибо!!!

Автор: Дмитрий Ченгаев 16/04/2023 03:04:58

Спасибо. Отметил в планы на будущее.

Автор: Vasiliy Bulykin 09/04/2023 07:04:15

а есть ли в планах уроки по symfony mercury? сообщения в реальном времени — крайне интересная тема. особенно если её объединить с фронтом на vue.

Автор: Дмитрий Ченгаев 09/04/2023 11:04:39

Записал как идею. У меня пока не так много опыта с mercury. А так идея интересная, спасибо. Возможно, в будущем что-то появится.

Автор: lavie 10/11/2022 07:11:14

Добрый день. Не пойму по содержанию, есть ли в курсе про Dto, Data Transformer, Data Provider?

Автор: Дмитрий Ченгаев 10/11/2022 07:11:08

Добрый день. Этих тем пока нет.

Автор: Vasiliy Bulykin 02/10/2022 11:10:08

всё понятно, кроме того, как эти пользоваться :)

делаю "$info = file_get_contents('https://127.0.0.1:8000/api/products');"
получаю "Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed"

Автор: Дмитрий Ченгаев 02/10/2022 11:10:31

Нет )

file_get_contents совсем не для этого. Это для работы с файлами.

Смотрите. Если в браузере можете так получить продуткты
https://127.0.0.1:8000/api/products.json

Можно через REST-клиент соединится. Посмотрите эту серию видео
https://webkyrs.info/category/insomnia-api-rest-klient

Если через PHP из кода, то можно через CURL получить данные.

API - это для сторонних взаимодействий. Либо со стороннего сервера, либо с фронтенда к нему обращаетесь через AJAX. Например, можно использовать библиотеку axios

Автор: Vasiliy Bulykin 02/10/2022 12:10:38

ага.

$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HEADER, false); //
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_URL, 'https://127.0.0.1:8000/api/products');

$result = curl_exec($curl);

помогло. особенно с выключенной проверкой ссл сертификата :)

Автор: Дмитрий Ченгаев 02/10/2022 12:10:48

Да. Все верно. Чтобы не заморачиватся с установкой SSL вполне можно отключить.

Автор: Скачков Александр 07/10/2021 10:10:39

Подскажите пожалуйста, что делать в случае если, к примеру, есть сущность сity (список городов) и возникает задача отдавать по АПИ города и значение температуры воздуха в каждом из них?
За данными по температуре придеться обращаться к стороннему погодному АПИ, т.е., если я правильно понимаю, нужно будет сделать сервис в symfony который дергает это погодное АПИ. Но как это все правильно оформит с архитектурной стороны и откуда вызывать погодное АПи для города я не понимаю?

Автор: Дмитрий Ченгаев 08/10/2021 12:10:15

Т.к. данные температуры хранятся на стороннем сервисе - это усложняет задачу.

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

В этом случае хранить данные о температуре в вашей базе данных не обязательно.

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

Далее просто делаете выборку с вашей базы данных и отдаете их по АПИ.

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

Автор: Скачков Александр 07/10/2021 04:10:04

А вот интересно как сделать поиск по текстовому полю? ну т.е. есть поле description="Всем привет, я Саша" и вот хочу я запрос сделать, что-бы найти все записи description где есть "Саша" (ну т.е. что-то типа LIKE "%Саша%")

Автор: Дмитрий Ченгаев 07/10/2021 09:10:58

В API Platform это делается через фильтры
https://api-platform.com/docs/core/filters/

*@ApiFilter(SearchFilter::class, properties={
* "description": "partial",
* })

partial strategy uses LIKE %text% to search for fields that contain text.

Далее в запросе используете
api/pages?description=Саша

Примерно так.

Автор: Алексей Пустоутов 16/02/2021 09:02:19

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

Автор: Дмитрий Ченгаев 16/02/2021 11:02:08

Алексей, хороший вопрос. Из того, что я нашел. Есть 2 основных типа авторизации: с помощью логина и пароля и JWT авторизация.

Логин и пароль:
//config/packages/security.yaml

firewalls:
...
main:
json_login:
check_path: app_login
username_path: email
password_path: password

JWT авторизация есть вот такая еще статья:
https://yusufbiberoglu.medium.com/jwt-authentication-and-refresh-token-on-api-platform-7c6ecaa8e236

С этим придется поразбираться )