Пилот
Маппинг
а в каком кейсе тогда он вообще юзабелен? и какой мапинг тогда лучше юзнуть в моем случае? доктрина ведь ругается, если в двух разных мапингах одна и та же таблица указана
Nikolay
Есть кастомер, есть юзер
Nikolay
точнее если для двух разных мапингов классов, например User.orm.yaml и Customer.orm.yaml указана table: user
У тебя должна быть отдельно юзер, отдельно кастомер, кастомер ссылается на юзера
Пилот
У тебя должна быть отдельно юзер, отдельно кастомер, кастомер ссылается на юзера
так то я и пытаюсь сделать. сделал с помощью Doctrine inheritance mapping) у меня Customer, NotActivatedCustomer, DeletedCustomer и BannedCustomer, со своими методами/филдами каждый. только вот это не супер пупер юзать doctrine inheritance mapping как я понимаю для этого? потому что если не юзать такой тип мапинга, то доктрина ругается, что у мапингов для разных классов (Customer.orm.yaml, DeleteCustomer.orm.yaml, etc) указана одна табличка user
Nikolay
Это как вариант, он более гибкий
Nikolay
а, типа через композицию?
Да, не надо наследование здесь
Пилот
понял. надо попробовать будет зарефакторить. надеюсь не будет особо подводных камней) а так сочно выглядел этот тип мапинга поначалу) а еще с ворфлоу компонентом тоже чето не получилось) можно указать транзит из одного только стейта, во множество других, но как указать массивом стейты, ИЗ которых можно в массив других стейтов выйти, я не нашел) но надо будет пересмотреть детали трабла на свежую голову, может то я долбоеб)
Пилот
Пилот
что то типа такого хотел) поигрался и забил. тк еще к тому же там юзался в кач-ве marking_store паблик метод, а я хотел бы чтобы транзишн был рефлексией, как у доктрины выборка
Пилот
гидрация точнее
Пилот
может я херню спорол сейчас, но если в юзкейсе юзать типа такого, то статус можно поменять случайно через паблик метод, просто прогрузив ентити. соответственно надо чтобы воркфлоу стратегия агрегировалась сущностью у которой меняется статус, чтобы трекать через стейт машин консистентные транзишены, хз даже
Пилот
грубо говоря псевдокод такой: if ($workflow->can($initiative, 'republish')) { $workflow->apply($initiative, 'republish'); } такой клиентский код у компонента state machine/workflow. а под капотом он через указанный в workflow.yaml параметр marking_store: type: 'method' property: 'status' он вызывает $initiative->setMethod($status), который и есть тот паблик метод. поэтому если случайно энтити $initiative протек куда-то кроме UseCase, в котором этот блок if($workflow->can()) then $workflow->apply() вызывается, то можно поменять статус с любого на любой, а не по логике транзишенов) поэтому я подумал, что $workflow проверки должны быть внутри сущности, а не снаружи, как у меня в UseCase, чтобы не было возможности сменить в обход с $workflow статус, а также чтобы не было паблик метода. но как агрегировать симфонийский воркфлоу безболезненно в доменную сущность, я хз. либо писать свой кастомный state machine лол, в доменном слое простигосподи, чем я точно заниматься не хочу.
Пилот
но такой транзишен статусов в целом позволяет соблюдать инварианты же, что есть приятно.
Nikolay
грубо говоря псевдокод такой: if ($workflow->can($initiative, 'republish')) { $workflow->apply($initiative, 'republish'); } такой клиентский код у компонента state machine/workflow. а под капотом он через указанный в workflow.yaml параметр marking_store: type: 'method' property: 'status' он вызывает $initiative->setMethod($status), который и есть тот паблик метод. поэтому если случайно энтити $initiative протек куда-то кроме UseCase, в котором этот блок if($workflow->can()) then $workflow->apply() вызывается, то можно поменять статус с любого на любой, а не по логике транзишенов) поэтому я подумал, что $workflow проверки должны быть внутри сущности, а не снаружи, как у меня в UseCase, чтобы не было возможности сменить в обход с $workflow статус, а также чтобы не было паблик метода. но как агрегировать симфонийский воркфлоу безболезненно в доменную сущность, я хз. либо писать свой кастомный state machine лол, в доменном слое простигосподи, чем я точно заниматься не хочу.
Сущности не должны зависеть от инфраструктуры
Пилот
Сущности не должны зависеть от инфраструктуры
ну да, потому я хз как без dependency inject внедрить в сущность через интерфейс имплементацию
Пилот
ну или как уже написал - сделать в доменном слое доменный сервис например, который инстанцировать в сущности
Пилот
в этом и трабл(( пока решения не нашел толково адекватного, да и сложность проекта вроде не такая уж большая чтобы долбаться) но хотелось конечно солюшен какой то "на будущее"
Пилот
а воркфлоу через сеттер тоже передавать такое - тогда любой клиентский код в обход конфигов воркфлоу может любой другой воркфлоу передать, что вообще рушит смысл этого воркфлоу имхо )
Пилот
Я бы абстрагироваться от этих инструментов пока
та вот да) это из беклога "задачка" у меня по сути годичной давности наверное уже )
Пилот
Так в чем проблема
Имеешь ввиду забить?)
Nikolay
Имеешь ввиду забить?)
В чем суть задачи?
Пилот
В чем суть задачи?
ну если вкратце подытожить то думаю можно так сформулировать: нужно использовать конечный автомат (state machine) для осуществления транзишенов в рамках описанных правил, которые нельзя поменять для этой сущности извне через клиентский код (только через внешние конфиги типа initiative.workflow.yaml)
Пилот
желательно в кач-ве имплементации стейт машина использовать симфони воркфлоу
Пилот
потому что иначе выходом вижу только свой кастомный доменный сервис имплементящий простейший стейт машин
Пилот
но как прокинуть внутрь энтити без внешних сетеров инжекцию симфонийского воркфлоу - хз )
The Ant
В чем шляпа?
Павел
В чем шляпа?
Минимум в названии, но думаю и в логике
Павел
and в названии не смущает?
The Ant
Минимум в названии, но думаю и в логике
В логике там тоже самое что и у тебя 🤣
Павел
И классов таких нет)
The Ant
and в названии не смущает?
Нет. Без него будет не то. Сухо так сказать ?
The Ant
Как бы ты назвал?
Павел
Нет. Без него будет не то. Сухо так сказать ?
Короче честно, у меня с тебя прям максимальный дисонанс) У тебя вроде и опыта я так понимаю много, но вроде порой такую шляпу выдаешь))
Павел
Пилот
Я бы сначала без воркфлоу посмотрел что можно сделать
Та вот иначе без Стейт машин может быть лапша из кондишенов если много статусов и тп. Хотя мб консистентность перехода можно проверять в самом классе статуса, который инжектить в энтити)
Павел
Я вижу какие то два класса, с странным названием в каталоге Валидатор. Как я могу что-то там называть?
The Ant
Что именно?
Валидатор дто, который ошибки группирует по полям
Павел
Валидатор дто, который ошибки группирует по полям
А накой хер снаружи знать, что 1) валидирует дто, 2) что группирует что-то по полям?
The Ant
А накой хер снаружи знать, что 1) валидирует дто, 2) что группирует что-то по полям?
Потому что он: 1) валидирует дто и ничего больше. 2) группирует ошибки по полям.
Павел
Потому что он: 1) валидирует дто и ничего больше. 2) группирует ошибки по полям.
1) У тебя есть интерфейc Дто? Это шляпос 2) Ты видел как например называется Сериалайзер в симфони? Он не называется, КлассКоторыйСмотритПоляПоНормАлАйзерамАЕщеМожетДенормалиЗоватьИДелатьCSv
The Ant
Чоб и не называть так? ))) Зато понятно шо делает
Павел
Чоб и не называть так? ))) Зато понятно шо делает
Это раскрытие реализации, не имеет смысла
Пилот
@sc0rp10 вот такие массивы from как я понимаю указывать нельзя?
The Ant
Это раскрытие реализации, не имеет смысла
Потому что эти объекты и есть реализация? Их там не даром два штуки )
Павел
Что ты ждешь от класса? Валидации. Ну пох, пусть будет только Дто. Назови DtoValidator
The Ant
Один делает одно, другой другое
Павел
Я вот смотрю, я даже не понял по названиям что этор валидаторы
Павел
я думал какие то ДТОшки
The Ant
Что ты ждешь от класса? Валидации. Ну пох, пусть будет только Дто. Назови DtoValidator
Что делать с ошибками? Которые надо выдавать в двух вариантах
Павел
Что делать с ошибками? Которые надо выдавать в двух вариантах
Может быть сделать один валидатор и например 2 трансформера/нормалайзера?
Павел
Как вообще получается, что ты смешал отображение с логикой?
The Ant
Я вот смотрю, я даже не понял по названиям что этор валидаторы
Блять... Там написано - валидатор дто. Пора учится читать ))
The Ant
Может быть сделать один валидатор и например 2 трансформера/нормалайзера?
И потом тащить две зависимости. Я ведь так и сделал. Там в чате есть
The Ant
Потом подумал что это хуйня, в кучу контролёров по две зависимости таскать
Павел
И потом тащить две зависимости. Я ведь так и сделал. Там в чате есть
Там кстати тоже шляпа, тебе ниже описали - кидай просто экзепшен, если красиво
Konstantin
@sc0rp10 вот такие массивы from как я понимаю указывать нельзя?
понятия не имею, если честно. не пользовался воркфлоу, знаю что такое FSM из CS
Пилот
Кстати ещё интересно вбросить немного за Manager-like naming)
Пилот
Типа что окончания -or/-er