Alexey Mishurovskiy
Ваш вариант описания схемы не очень понятно выглядит
ну а что не понятно? принимаю id в поле terminal далее entity extractor мне его разворачивает в entity (находит в бд по id) и тогда сущность сохраняется,либо не разворачивает и тогда ошибка запроса
Alexey Mishurovskiy
Я использую в виде json
и все сущности руками тогда прописывать как я понимаю?
Alexey Mishurovskiy
Поэтому предпочитаю дто)
DTO на сущность руками потом маппить ?
Alexander
Дто передаём в сервис
Alexey Mishurovskiy
Дто лучше
тогда смысл сваггера теряется. проще просто доку править в doc файле и не морочится 😊
Alexey Mishurovskiy
Получается мне надо каким-то образом(каким?) изменять тип поля в зависимости от группы сериализации
Alexey Mishurovskiy
т.к. в одном случае мне понадовится только id а в другом полный объект
Alexander
а со всторым пытаюсь понять. по факту terminal поле это id и он должен существовать. сваггер мне разворачивает его в объект. как от этого избавится ?
Написать свой нормалайзер для сериалайзера под конкретную энтити. Выглядит все это как-то стремновато. Я делаю так: Контролер принимает запрос 1) из запроса десереализуем json в DTO 2) дто валидируется валидатором 3) если ошибок валидации нет передаем дто в сервис 4) ответ сервиса сериализуем сериалайзером Смысл дто в том, что она может быть кривой, невалидной, id может не существовать а в полях вместо интов могут быть стринги или массивы. Но энтити всегда валидна и у нее не может быть сломанного состояния (это достигается именованными конструкторами и т.д.: отдельная тема). В качестве бонуса можем использовать дто в опенапи аннотациях.
Alexander
Ну и дто мы пишем не для контроллеров, а для сервисов. Задача контроллера это дто из запроса собрать и отвалидировать.
Alexander
В консоли то же самое дто каким-то другим образом будет собираться.
Alexander
А как вы сейчас кладете запрос с 100 полями на сущность?
Alexey Mishurovskiy
с помощью сералайзера.
Alexey Mishurovskiy
денормализовать\нормализовать получается через массив ?
Alexey Mishurovskiy
а если сложная вложенная структура ?
Alexander
да
Alexey Mishurovskiy
хотя по факту тоже самое, просто добавляется прослойка в виде ДТО
Alexander
нормалайзер - из массива в объект/из объекта в массив енкодер - из массива в стрингу/из стринги в массив
Alexander
Только вы валидируете сущность, а это не очень хорошо по ряду соображений.
Alexey Mishurovskiy
а как в вашем слуае валиировать сущность на наличие по id? или это уже елается на этапе нормализации ДТО в сущность ?
Alexander
точно также все как и сейчас делаете, только правила валидации не в сущности, а в дто
Alexander
https://www.thinktocode.com/2018/04/02/symfony-4-rest-api-part-2-data-transfer-object/ Пример как можно организовать маппинг дто в энтити.
Alexey Mishurovskiy
точно также все как и сейчас делаете, только правила валидации не в сущности, а в дто
Ну сейчас у меня EntityEncoder и соответственно либо нашел по id либо null
Alexander
Может показаться избыточным, но когда сущности кидают исключения при попытке запихать в поле какую-нибудь дичь, разработчики спят гораздо спокойнее.
Alexey Mishurovskiy
когда одну и ту же сущность надо замаппить с разных ДТО - соответственно разные методы в сервисе ?
Alexander
Ну сейчас у меня EntityEncoder и соответственно либо нашел по id либо null
Тут я вам не подскажу, я id не проверяю валидатором на существование. Это комплексная проверка как правило, мало узнать есть ли строка с таким ключом в базе, надо проверить статусы, софтделитабл и т.д. Если сущности нет - это 404 а не 400.
Alexey Mishurovskiy
с тайпхинтом нужного ДТО ?
Alexander
с тайпхинтом нужного ДТО ?
От задач зависит, универсального ответа нет. Где-то приходится делать CreatePaymentDto, UpdatePaymentDto и т.д., где-то хватает одной PaymentDto.
Alexey Mishurovskiy
От задач зависит, универсального ответа нет. Где-то приходится делать CreatePaymentDto, UpdatePaymentDto и т.д., где-то хватает одной PaymentDto.
Ну то есть получается что с внешним миром у вас общаются только ДТОшки. да, они частично дублируют сущности, но это необходимое зло, чтобы иметь точно прогнозироуемый набор данных?
Alexey Mishurovskiy
Вопрос как в обратную сторону - сериализуете тоже ДТО ? или сущность по группе ?
Alexander
Вопрос как в обратную сторону - сериализуете тоже ДТО ? или сущность по группе ?
Обычно сущностей хватает, дто для чтения редко нужны.
Alexey Mishurovskiy
спасибо ) решил проверить что у меня мысль работает в правильном направлении )
Alexander
Не за что )
Andrei
Могет тело реквеста автопилотом мапить на dto
Alexey Mishurovskiy
Так это сериалайзер может, нет?
Andrei
Возможно юзает, не заглядывал внутрь
Andrei
Там просто в экшен контроллера передашь типизированный параметр дто, и он её инжектит смепленную уже из реквеста
Юра
https://github.com/zim32/symfony-skeleton-rest-only/blob/v5.2.8/src/Entity/Book.php
Юра
смотри поле author
Юра
там у меня есть свой анотейшн процессор который это разруливает
Alexander
Гугланите fos rest params converter
Если вам говнокод нравится, лучше сразу лару взять. А от fos лучше вообще никакие бандлы не использовать.
Юра
Что именно работает?
Alexander
Там просто в экшен контроллера передашь типизированный параметр дто, и он её инжектит смепленную уже из реквеста
Под капотом там сериалайзер, только начинаются пляски с аннотациями чтобы через них контекст (группы и т.д.) в сериалайзер передать.
Alexander
Что именно работает?
Дтошки в аннотациях, процессоры свои не нужны уже.
Alexander
Возможно юзает, не заглядывал внутрь
https://github.com/FriendsOfSymfony/FOSRestBundle/blob/3.x/Request/RequestBodyParamConverter.php
Юра
Мой процессор там не про дтошки вообше
Alexander
Не правильно понял значит, прошу прощения
Юра
Он создает схемы на основе груп сериализации, чтобы в доке асе правильно было. Плюс есть возможность указать разные типы пропертей для разных схем
Юра
Дтошки не юзаю, справляюсь сериалайзером
Денис
А от fos лучше вообще никакие бандлы не использовать. Прошу прощения, а почему? Что с ними не так?
Alexander
А ну так это не важно, дто или энтити - сериалайзеру без разницы.
Alexander
А от fos лучше вообще никакие бандлы не использовать. Прошу прощения, а почему? Что с ними не так?
Плохо поддерживается, куча багов, пропаганда плохих практик (как например переезд бойлерплейта из пхп в аннотации без изменения смысла)
Alexander
Все что у них был путного давно уже завезли в саму симфу, включая пользователей.
Денис
понятно.
Денис
Для эластика бандл их юзал, альтернативы не нашел
Alexander
Для эластика бандл их юзал, альтернативы не нашел
Мало с эластикой в пхп работал, хватало официальной либы. Там все на массивах, т.е. она достаточно низкоуровневая, но и задачи были не сложные. Не буду критиковать того что не пробовал - возможно этот бандл вполне не плох. Больше всего боли доставил именно fosrestbundle. У них бандлы не очень много кода содержат, который является, по большей части, обвесом над другими библиотеками/компонентами. Если нужна скорость разработки - вполне пойдет. Если нужен контроль над происходящим и стабильность - проще обвес сделать самостоятельно. Например они поддерживают и сериалайзер симфони и jms. Больше кода - больше багов, меньше скорость и т.д.
Денис
Мало с эластикой в пхп работал, хватало официальной либы. Там все на массивах, т.е. она достаточно низкоуровневая, но и задачи были не сложные. Не буду критиковать того что не пробовал - возможно этот бандл вполне не плох. Больше всего боли доставил именно fosrestbundle. У них бандлы не очень много кода содержат, который является, по большей части, обвесом над другими библиотеками/компонентами. Если нужна скорость разработки - вполне пойдет. Если нужен контроль над происходящим и стабильность - проще обвес сделать самостоятельно. Например они поддерживают и сериалайзер симфони и jms. Больше кода - больше багов, меньше скорость и т.д.
Логично тоже. Сам работал не так много с эластиком, мне понравилось обновление индексов при изменении сущностей и интерфейсы для работы с апи. Хотя не уверен, что стоило тащить ради этого в проект весь бандл
Alexander
Читайте исходники того что тащите 😄
Alexander
https://github.com/doctrine/orm/blob/2.9.x/lib/Doctrine/ORM/UnitOfWork.php Это полезно и "сеньерам" городящим 1000 и 1 класс на простейшие задачи с фабриками абстрактных фабрик. Но за пример такое брать я бы не стал конечно )
Денис
https://github.com/doctrine/orm/blob/2.9.x/lib/Doctrine/ORM/UnitOfWork.php Это полезно и "сеньерам" городящим 1000 и 1 класс на простейшие задачи с фабриками абстрактных фабрик. Но за пример такое брать я бы не стал конечно )
Божечки кошечки. Да тут вопрос в том, когда я даже знаю, что в пакете куча ненужного мне хлама. Как раз когда этот бандл с эластиком я тащил, я думал, что проще самому несколько классов нарисовать для работы с ним, которые будут делать ровно то, что мне нужно. Но потом подумал, что бандл мне не только время сэкономит, но тому кто будет этот проект потом поддерживать не придется разбираться с моим самописным велосипедом
Alexander
Так тащите классы из бандлов. Тот же парамконвертер я видел в куче проектов без фосреста. И сразу понимаю что это такое и с чем его едят. Вариации бывают конечно, но это не сильно портит жизнь. В конце концов у каждого проекта своя специфика.
Maks
Под конец месяца новых вакансий подвезли, кому интересно @symfonyjobs
Alexey Mishurovskiy
КОллеги, подскажите плиз хороший зарубежный хостинг, где есть возхможность VPSки организовать в ЛВС? помимо DO, AWS и Vultur
Alexander
Hetzner
Alexey Mishurovskiy
Hetzner
А если более абузоустойчивый ?
Юра
Inferno solutions
Юра
Норм пацаны
Юра
Есть сервера забугром
Alexander
А если более абузоустойчивый ?
несколько тысяч доменов - полет отличный