А для чего же тогда используете ES-модели? Или имелось ввиду модели без ES-инфраструктуры, а в репозиториях получаем все события и в рамках транзакции пишем в БД, например, нативным SQL или датамэппером.
Да, имелось в виду это.
Причин тут несколько.
Во-первых, именно модель знает о том, что же там внутри нее изменилось. Поэтому это логично записывать события внутри нее, а не снаружи. Это пока не требует именно ES-подхода, но очень близко к нему (мы просто записываем ->recordThat(new EventWasBuzzed() события по мере необходимости) .
Во-вторых, повышается риск расхождения между состоянием модели и событиями, если мы их записываем независимо. В ES-модели это невозможно в силу того, что изменения происходят тогда и только тогда, когда есть событие. Нет событий — никто эти изменения не увидит. Есть события — они обязательно повлияют на состояние модели.
В-третих, у нас была инфраструктурная проблема. Нужно было простое и понятное получение изменений модели. Дело в том, что если маппинг сложный и/или Doctrine по каким-то причинам не подходит для маппинга domain model напрямую, то получение диффа превращается в непростую задачу. Даже получив дифф (в виде массива свойств, которые изменились), требовались какие-то дополнительные проверки того, что именно привело к изменению, потому что в базе данные по разным причинам иногда хранятся по разному. Т.е. в модели может быть статус + какой-то флаг, а в базе это может хранится в виде одного числа. Повышался риск того, что реальные изменения в модели не будут соответствовать тем, что пойдут в базу. С явным же списком событий эта вероятность существенно снижается.
Есть ещё ряд некоторых неочевидных плюсов, но это основные.