Павел
Вадим
Павел
у меня в каждой репке персист+флуш
В этом подходе есть одно "но" проблемное, что uow в доктрине глобальный. Поэтому вызывая флаш в репо одной сущности, сохраняются другие, что как бы не слабый такой сайд эффектик
Павел
Потому что с точки зрения аппки, мы как раз не знаем, что стоит за репо: БД, память, или что то другое, для нас это коллекция их которой бы забираем сущности
Павел
Но если рассматривать "как сделать персистент, который не зависел бы с uow он или нет", то не должно быть никакого флаша на уровне апп, т.е. вне репозитория.
В общем нет какого то прям однозначного ответа, кому что ближе. Но имхо, зачем смотреть на что то потенциальное и в сравнении, если оно идет в разрез текущих технологий и вносит свои ньюансы.
Например можно сделать транзакцию над кучей флашей в репозиториях, но это открытие закрытие сейвопинтов, что доп задачи для БД
Вадим
а подскажите пож как отключить события доктрины в тестовой среде
Юра
Может лучше твои листенеры отключить в тестовой среде?
Юра
Я не уверен что можно отключить доктрин события
Михаил
Юра
Symfony\Component\DependencyInjection\Attribute\When
Юра
#[When('<env>')]
Юра
Попробуй так
Вадим
Dmitriy
есть ключик debug, как-то так называется
Вадим
Михаил
Михаил
на сколько я помню он в основном отключает логирование sql запросов и запуск дебаг листенерова
Михаил
2 и 3 сложновыполнимое
1 - очень явное и придётся прям в юзкейсе снова показывать этот отвратительную коллбек транзакцию или вызовы функций по открытию и закрытию
Вадим
Вадим
или я никак не пойму глобальной философии какойто
Вадим
2) если у меня кейс А подразумевает использование кейса Б то как их можно вызывать последовательно когда одно часть другого
The Ant
The Ant
Ну или сам себя...
Павел
Павел
Михаил
Павел
@vadbard Если у вас модульная структура, то тут или ивенты или прямые вызовы. Т.е. ну никак от этой вложенной чахорды не избавиться между модулями.
Внутри модуля лучше самого себя не вызывать,а вынести в сервис так уменьшится вложенность
Если не модульная, то просто разнесите все по каким то блокам, а уже юзкейсы эти блоки будут вызывать в той или иной последовательности без вложенности.
Павел
Павел
Просто если у вас модуль, то вы из одного модуля вызываете экшен (чтение или запись) другого, а что внутри этого экшена - не знай, может там цепочка из 10 вызовов
Михаил
Хорошо что напомнили про саги.
Возможно сага один из отличнийших способов делать сложную транзакцию из множества шагов (и даже сделать распределённую транзакцию). И в случае ошибки взять и откатить её, но оно требует дополнительных доработок в системе.
Но это речь уже не про доктрину.
Павел
Михаил
Михаил
Павел
Ну и это более вариативно
Павел
Т.е. как раз пайплайн и есть юзкейс, который вызывает какие то экшены
Павел
Юзкейс над юзкейсами)
Михаил
Только вот не понятно на каком слое находятся пайплайны.
Так как контроллер может запустить юзкейс, а может запустить пайплайн который запустит юзкейс.
Куда и как это прятать, как это объяснять - я хз, просто делаю вид что так и надо)
Павел
Тоже задавался таким вопросом, что ощущение что юзкейсы то никакие не юзкейсы, как мы их описываем
Павел
Павел
Что регистрация - это и есть юзкейс, который вызывает какие то "создать юзера", "создать покупателя", "создать что то еще". А не "создать юзера" - юзкейс в модуле авторизации
Павел
Т.е что есть какой то слой, который жонглирует контрактами модулей, и этот слой и есть слой юзкейсов какой то
Павел
Куда можно положить синхронные пайплайны, и например асинхронные саги
Михаил
Вообще для меня юзкейс - это некий спектакль. Он берёт актёров, декорации и показывает представление.
Представление о регистрации пользователя
Представление о написании нового поста
Внутри использую доменные сервисы, доменные сущности итд итп
Технически пайплайн (или сага) про то же самое.
Только там не одно представление а несколько последовательных историй:
1) Представление о регистрации пользователя
2) Представление о создании дашборда для новосозданного пользователя
3) Представление о отсылки письма с поздравлениями для новосозданного пользователя
Павел
Павел
Но в целом примерно так же смотрю
Вадим
привет!
Подскажите пожалуйста по удалению связанных сущностей.
Вот у меня есть Task и у неё Comments, классека OneToMany. Есть foreign key.
Удаляем таску, надо чтобы удалились комменты. Что мне написать?
1) orphanRemove:true у таски?
2) cascade: ['remove'] у таски?
3) Просто удалять Task а комменты сами удалятся?
4) Удалить комменты сперва, а потом таску?
5) Скаффолдер при создании сущности со связью OneTоMany прописывает метод removeComment(Comment $comment){} и там сперва делает $comment->setTask(null)
Нужно его использовать?
Сори за сумбур но я ваще запутался
Вадим
Orphan Removal
If an Entity of type A contains references to privately owned Entities B then if the reference from A to B is removed the entity B should also be removed, because it is not used anymore.
Подскажите пожалуйста что значит "удалить ссылку"?
Вадим
Viktor
Вадим
Cascade remove работает на уровне ОРМ
Михаил
Вадим
Да
ну то ладно, это понятнее всего, тут вопросов нет
Вадим
нет
https://www.doctrine-project.org/projects/doctrine-orm/en/3.2/reference/working-with-associations.html#transitive-persistence-cascade-operations
Вадим
тут говорят что да
Вадим
Viktor
https://gist.github.com/pylebecq/f844d1f6860241d8b025
Вадим
Михаил
Viktor
вот что значит "связь" в этом контексте?
Если очень грубо, По FK.
Например, у вас есть post и comment. Соотвественно, у поста есть комментарии.
Каждый комментарий ссылается на какой-то пост.
Если вы удаляете пост, то есть множество комментариев, которые перестают ссылаться на какой либо пост, потому что его удалили. Такие комментарии становятся сиротами (orphan) и тоже будут удалены в случае orphanRemoval true.
Вадим
Viktor
Вадим
Viktor
Вадим
ну вот у меня на этом месте возникает ошибка FK
Viktor
Кто-то, у кого orphanRemoval не проставлен
Вадим