про Event Sourcing

Adelf

Administrator
Команда форума
А что мешает использовать symfony/serializer? Производительность?
Думаю дело не в ней. В одной реализации он как раз и используется. Но делать поля публичными, или каждое покрывать геттером и сеттером - не оч хочется. Есть вариант нормализер переписать, чтобы он и приватные брал, но есть у меня мнение, что так делают не зря.

Вон, https://github.com/prooph/proophessor-do/blob/master/src/Model/Todo/Event/TodoWasPosted.php - тут каждый эвент эту работу скрывает внутри себя. Я не знаю, видимо для того, чтобы в будущем можно было удалить какое-нибудь свойство, или еще чего сделать, что уронит unserialize... Хотя как говорят товарищи, в этих случаях проще просто новый эвент сделать и юзать его уже, оставив поддержку старого.
 

Вурдалак

I'd like to model your domain
Посмотрел пару реализаций ES... Видимо, там нормально можно использовать только примитивы(хотя я сумел сериализовать в эвент VO с публичными полями).
Если в домене активно используются VO - их разворачивать в примитивы для записи в эвент и сворачивать обратно в VO. Это нормально? Или это можно как-то решать.
Сериализаторы типа JMS Serializer позволяют с приватными полями работать. VO, которые состоят из одного поля, можно инлайнить.
 

Adelf

Administrator
Команда форума
Сериализаторы типа JMS Serializer позволяют с приватными полями работать. VO, которые состоят из одного поля, можно инлайнить.
Ага. Работает :)
Но у меня больше вопрос про то, нормально ли это? Вы в эвентах храните VO?
 

Вурдалак

I'd like to model your domain
Ага. Работает :)
Но у меня больше вопрос про то, нормально ли это? Вы в эвентах храните VO?
Что значит «хранить VO»? В базе лежит JSON, который выглядит одинаково что с VO, что без благодаря инлайну:
Код:
final class TodoId { private int $id; }
final class TodoWasPosted { private TodoId $id; private string $title; ... }
{"id": 42, "title": "...", ...}
В любой момент можно перейти на int или наоборот с int на VO, это вопрос того как десериализовать.
Всегда можно добавить новое обязательное поле или игнорировать существующее (event upcasting).
 
Сверху