Юра
Ну что народ
Юра
Кто как аплоады файлов делает в рест апи?
Юра
Мультипартом шлёте или отдельный эндпоинт какой-то?
Denis
мультипартом на отдельный эндпоинт)
Юра
Т.е. энтити только через рилейшены на файлы завязаны получается?
Юра
Типо есть какая-то энтити аля MediaFile
Юра
И все остальные на неё?
Denis
да. в текущем проекте удобнее так
Юра
Я тут просто нашел два выхода чтобы в обычный рест интегрировать мультипарт
Юра
Либо активировать настройку в пхп
Юра
Либо использовать https://github.com/notihnio/php-multipart-form-data-parser
Юра
Остановился на библиотеке
Igor
Добрый день, сериализовал ли кто-нибудь object или массив на пхпшный лад, с выполнением Closure внутри? Нужно сделать serialize() Guzzle/Client с сохранением переменых
Konstantin
ох))
Юра
В джсон его засунь
Igor
В джсон его засунь
Потом мне все это дело вызвать надо, и в рамках джэйсона, вроде как, переменные среды (или не знаю, как правильно сказать) не учитываются. Мне затем вызвать инстанс этого Guzzle надо будет
Egor
Igor
Юра
По-моему проще сдедать какой-то ДТО из клиента и его сериализовать
Юра
Client - DTO - Json
Json - DTO - Client
Юра
Ну можно написать кастомный нормалайзер денормалайзер только смысла в этом нет никакого
artem
artem
Katulos
Где аффтары шутейки нашли человека по имени "Сережа"?
Katulos
В нынешний то век
Thawne
Всем добрый день, прошу не хейтить за глупый вопрос) У меня в базе есть поле типа JSON, туда сохрняется дата, все отлично. Но как мне сделать так, что бы я могу добавить к этому массиву другую дату а не перезаписать эту, то есть если я сейчас выберу еще одну другую дату то он перезапишет эту…
Vlad
$entity->dayOff[] = '12.12.2022'
Thawne
Kirill
Котаны, а есть какой-нибудь норм десериайлайзер в дто из ассоциативного массива\жсон? Симфонёвый полная помойка, а жмс тормознутый совсем
Kirill
А больше что-то не гуглится. Фрактал - не вариант, там руками надо будет все, а хочется автоматики и с поддержкой дженериков\типизированных коллекций хотя бы
Konstantin
особо вариантов нет, либо кодген, либо симфони
Max
Я вариантов других не нашел. Симфоневский по красоте всё делает но тяжелый пздц. Пришлось руками перекладывать, т.к. он тяжелый ппц
Kirill
Не, симфони - это трешанина полная. Как раз пересиливаю себя чтоб не выкинуть его нахрен и не написать нормальный
Konstantin
если есть какая-то схема апи, типа сваггера, можно самим дтошки генерить и делать им именованный конструктор ::fromArray(array $data): self {}
Konstantin
Konstantin
я про вторую часть идеи
Kirill
ну или тоже самое без промотуед проперти
Max
Там выключается исключение при проверке типа
Konstantin
а, так валидация - не задача сериалайзера. валидировать надо до того как десериалиуешь
Kirill
Konstantin
иначе сериалайзер превратится вообще в адский комбайн, если на него еще задачу валидации возложить
Kirill
Ну не знаю, могли бы бридж на валидатор добавить
Kirill
чтоб можно было отловить название поля, ожидаемый тип и отправляемый
Kirill
а так, приходится регулярками из тайп эррора выдирать, потому что симфоня не умеет
Kirill
Особо доставляет такой кейс:
public function __construct(
public readonly DateTime $date
) {}
{"date": "2019-07-07"} // OK
{"date": "2019-42-42"} // TypeError: Expected DateTime, but string passed
Kirill
И выловить и превратить в: field "date" must be correct datetime string - нереально
Kirill
Я уж не говорю про то, что нормалайзеры глобально конфижатся и ограничить:
public DateTime $date, // expected "Y-m-d"
public DateTime $datetime, // expected "Y-m-d H:i:s"
невозможно никак
Max
А почему не отвалидировать json до того, как начать сериализовать?
Kirill
Ну и невозможность сделать
/** @var array<MessageDTO> */
public array $items
тоже удручает
Kirill
Konstantin
вообще, выглядит так, будто вам нужно схему апи описать, и не насиловать бедный сериалайзер заведомо невалидными данными
Kirill
Konstantin
не должно такого быть, если у вас на обоих концах апи (клиент-сервер) описаны контракты этого апи в виде схемы
Kirill
Послать можно что угодно
Konstantin
если какой-то кулхацкер шлёт руками запросы с заведомо битыми данными - ок, можно и упасть с тайп эррором
Kirill
Kirill
если как часть конструктора или нуллабл, то отваливается
Konstantin
Konstantin
есть ишью на гх?
Kirill
Только некоторые
Kirill
Вот одно из https://github.com/symfony/symfony/issues/44925
Kirill
Т.е. это причина, почему нельзя выдрать название поля из partial denormalization ошибки
Kirill
и её тоже приходится руками регулярками разбирать, чтоб адаптировать в нормальный формат
Kirill
Сейчас и так пришлось обмазаться конвертерами ошибок, вида:
MissingConstructorArgumentsException, NotEncodableValueException, PartialDenormalizationException, NotNormalizableValueException, пытаясь их как-то превратить в ValidationFailedException
Kirill
Но я уже устал везде костылить, т.к. просто так получить инфу где именно случилась проблема десериализации не получается
Kirill
Короче, в данном случае задача всего лишь найти пакет, который будет норм маршаллить. А написать сверху бридж, который будет адаптировать ошибки десериалайзера в симфонёвые валидатора - уже не проблема)
Kirill
Konstantin
так ему не показывайте тип ошибки
Konstantin
просто "пришли невалидные данные"
Kirill
Нельзя так
Kirill
Нужно сказать ещё в каком месте ошибка
Kirill
что поле Х некорректное, например
Konstantin
у вас публичное апи или для своего фронтенда?
Kirill
Полупубличное под мобилки и веб.