Evgeniy
с более ранней версией не получится, я как-то очень плотно с этой проблемой воевал пару лет назад, ничего не вышло
А с этой версией получилось? У меня валится по причине An exception occurred while executing a query: SQLSTATE[23502]: Not null violation: 7 ERROR: null value in column "id" violates not-null constraint DETAIL: Failing row contains (null, -756344054, 2, 536, My new group 1808, group, 2022-08-22 12:56:21, 2022-08-22 12:56:21). Ну оно логично, id - not null, но когда делаем save сущности, где null идет в ключе - оно генерируется. Т.е. doctrine для ключа видимо где-то перед отправкой все таки property вообще удаляет. Т.к. при прямом insert в БД без null все работает - с null, ошибка повторяется. Для field видимо этого не завезено, либо я что-то упускаю. Вопрос - как сохранить сущность, у которой автоинкрементируемое неключевое поле == NULL?
Konstantin
#[ORM\Column( name: 'foo', type: 'integer', unique: true, insertable: false, updatable: false, columnDefinition: 'default nextval(foo_seq)', generated: 'INSERT', )] protected readonly int $foo;
Konstantin
вот прям из боевого кода скопировал
Юра
А как-то можно сделать чтобы универсально без дефолт некствал?
Konstantin
видимо свой column писать, который по типу @Id умеет найти имя сиквенса по имени таблицы
Юра
У постгре нету автоикремента я так понимаю?
Konstantin
увы) это раковая концепция довольно, постгрес мощнее в этом плане
Юра
Ну сделали бы поверх этой супер мощной концепции обычный инкремент ) обычно его с головой хватает
Юра
Для простых проектов
Юра
Значит есть автоикремент?
Evgeniy
Значит есть автоикремент?
https://sqlserverguides.com/postgresql-auto-increment/
Юра
Статья топ. Явно разбираются в сео
Павел
Если глобально, думаю можно описать это в качестве аргумента в DI, как то делал через компайлер пасс, но не думаю, что это верный путь
Gleb
Можно в контекст передать формат. Посмотрите сам DateTimeNormilizer, какие ключи там читаются из контекста
Спасибо, гляну ещё раз. Я полез в сериалайзер вглубь кода, но пока победить не смог. Ругается на строку вместо объекта. То что я пока расковырял, я не все аргументы передаю, у меня тип отличный от примитива внутри денормалайзера не определяется.
Павел
Павел
Вот, вроде можно, кейс так же работает, как и с нормализацией
Юра
Сериализатор по дурацкому сделан
Юра
Через цепочку обязанностей
Юра
У меня каждый раз голова взрывается когда начинаю его дебажить
Gleb
Если ругается, что не может опредлеить объект, то надо описать в DTO тип проперти, возможно через сеттеры и геттеры
Спасибо, геттеры и сеттеры я не прописывал ещё. Но помню что где-то встречал и без них работает. property: #[Assert\Type('DateTime')] public DateTime $date; Сериалайзер вроде как обычно объявил $this->serializer = new Serializer([new DateTimeNormalizer(), new ObjectNormalizer()],[new JsonDecode() ]); После сериализации не проходит валидация, у меня на выходе строка так и остается.
Юра
Имхо надо было делать через арену или что-то такоея как секурити воутеры
Gleb
Знаю про DateTimeImmutable) это учебный проект.
Konstantin
совет мимопроходила: не юзайте DateTime, переходите на DateTimeImmutable
Павел
Посмотрел свои dto, да, геттеры, сеттеры не юзаю для дат
Павел
Хотя сам не пойму точно 😅😅😅
Gleb
Ну вот такая штука норм работает с датами на денормализацию массива. Честно говоря не помню, решает ли тут рефлекшен экстрактор, попробуйте
Спасибо большое. Я как раз доковырялся до параметров ObjectNormilizer, но там глубокая кроличья нора) И у меня из метода я вылетаю по пустому $propertyTypeExtractor. Пока на нём тормознулся. Потом всё равно доковыряю кейс, что там внутри)
Павел
@oleynikgleb А вообще, если юзаете для json которые летят из request, наверное проще брать уже собранный фреймворком сериалайзер. Немного накладнее по ресурсам, но это спички, имхо
Павел
Можно даже денормалайзер, и в него засунуть массив из $request->toArray()
Gleb
@oleynikgleb А вообще, если юзаете для json которые летят из request, наверное проще брать уже собранный фреймворком сериалайзер. Немного накладнее по ресурсам, но это спички, имхо
Спасибо за советы. Я вообще изначально его и брал. Но там ещё "хуже" было поведение. Хотя вроде в списке нормалайзеров DateTime есть. Но я не понял почему он вообще не хотел дату воспринимать даже с ошибкой, из контейнера - он тупо поле пропускал. Но тут да, на курсе мы больше вертели JMS и то не в эту сторону, а тут я раскуриваю дефолтный, вопросов ещё много.
Павел
Сериалайзер из контейнера
Gleb
Хз, вот это работает)
Хм... кажется пора приобретать привычку кэш физически сносить. Сейчас и у меня запустилось. 🤔 хотя восстанавливал через ctrl+z, т.е. тот код, который не поднимался.
Gleb
Кстати, а часто кэш подвисает и cache:clear не чистится? коллеги рассказывали что бывает и такое.
Павел
Но поидее кэшу тут решать нечему.
Павел
Кстати, а часто кэш подвисает и cache:clear не чистится? коллеги рассказывали что бывает и такое.
Мб машина слабая или проект большой. В целом проблем таких не встречал, ну чтобы запомнились.
Gleb
Но поидее кэшу тут решать нечему.
Объект нормалайзера вроде кэширует свойства метода и его аттрибуты.
Павел
Объект нормалайзера вроде кэширует свойства метода и его аттрибуты.
Там вроде компонент кэша нигде не передается. А внутреннее кэширование, чисто внутри проперти объекта в рантайме для оптимизации. По крайней мере не вижу физического кжширования на первый взгляд
Gleb
Там получается как минимум есть (/vendor/symfony/serializer/Serializer.php метод denormalize, переменная $normalizer) -cache: Symfony\Component\Cache\Adapter\PhpArrayAdapter {#363 -file: "/app/var/cache/dev/annotations.php" и -denormalizerCache: array:1 [ "json" => array:1 [ "App\DTO\SaveLessonDTO" => array:3 [ 0 => false 10 => false 11 => true ] ] ] -normalizerCache: [] плюсом где-то ещё видел метки времени по жизни кэша.
Gleb
в самом объекте нормалайзера
Gleb
в любом случае ещё раз большое спасибо!)
Юра
Кешируют всякие проперти экстракторы
Юра
И аксессоры
Юра
Стоп я что-то не понял
Юра
Я думал \Exception это базовый тип для всех исключений
Юра
Оказывается нет
Юра
Т.е. если написать catch (\Exception $e)
Юра
то нет гарантии что оно словит все исключения
Сергей
Пиши Throwable $e
Konstantin
^ не пиши
Иван
пиши не пиши
Gleb
^ не пиши
А почему не писать? Вопрос действительно интересный. Сейчас разделили на классы Error и Exception. А если нет DI, интерфейс вообще можно поймать?
Gleb
и чуть ниже
Спасибо! пропустил это обсуждение.
The Ant
Я думал \Exception это базовый тип для всех исключений
Был, до 7 какой-то там. Щас это интерфейс \Throwable
Юра
Получается брейкинг чендж
Alexey Mishurovskiy
Всем привет! кто-то занимался реверсом ionCube?
Kirill
Всем привет! Кто-нибудь использует mutagen для разработки под докером на маке? Пишут, что он ускоряет докер на маке и работать не так больно)
Konstantin
мутаген - это про ансибл все же, не до конца понимаю как он докер на маке должен ускорять
Vlad
так докер на маке и так уже быстрый, если конечно включен VirtioFS
Konstantin
ага, нагуглил уже, спасибо
Konstantin
так докер на маке и так уже быстрый, если конечно включен VirtioFS
я еще когда-нибудь хочу довести до рабочего состояния nerdctl поверх lima
Kirill
ну что-то чуда не произошло)
Andrei
Коллеги, а у вас не было кейса когда нужны две сущности доктрины, основанные на одной и той же таблице?
Konstantin
а зачем? так-то можно, а какую проблему решаете?
Andrei
В кодовой базе нашел
а, типа все аннотации в Maker написаны?
Eldar
а, типа все аннотации в Maker написаны?
ага. но я хз правда для чего так сделали
Andrei
а зачем? так-то можно, а какую проблему решаете?
Два разных контекста в одном добром монолите
Andrei
соответственно есть два разных агрегата из разных контекстов. но оба имеют в составе сущности, которые опираются на одну таблицу бд. Наводить микросервисную ересь с отдельными БД нет желания)
Konstantin
так, а в чем сложность тогда, оно вроде из коробки сработает. максимум - MappedSuperclass придется сделать, но это не точно