Лучше рассмотреть события без привязки к ddd. Цель событий - убрать связанность между компонентами. Например есть интернет магазин.
Есть сервис в котором реализована логика создания заказа - после создания заказ находится в статусе - "обрабатывается". Создание нового заказа должно инициировать оповещение клиента по почте, запрос на резерв товара у конкретного поставщика, информирование смежной системы отвечающей за сбор данных о пользователях (информация для маркетинга ) и т.д.
Ключевое слово здесь - "и .т.д" - т.е. компонентов которые реагируют на создание заказа может быть переменное количество.
Вариант дергать каждый компонент из сервиса заказов - трудоемкое решение - появится новый компонент который должен реагировать на создание заказа - и нужно вносить правки в сервис заказов.
Альтернатива - бросать событие. Сервис/компонент который бросает событие - не знает кто его будет обрабатывать. Сервисы которые реагируют на событие - знают о событие, но не имеют связи с компонентом который его бросил. Они знают о имени события и знают как на него подписаться.
Т.е. обработчик знает как минимум имя события, а сообщение с информацией о событие содержит всю необходимую информацию для его обработки.
При этом лучше думать о будущем и понимать что со временем тот кто бросает событие и тот кто его обрабатывает - могут оказаться не в рамках одного приложения, а разнесенными по разным микросервисам.
Поэтому имена событий завязывать на классы - очень спорное решение, так как через год-два - может получить ситуацию что событие бросает сервис на php, а обрабатывает сервис на nodejs
Нужно продумать и зафиксировать протокол описывающий сообщения которые бросаются событием. Данные сообщения события могут включать: имя события, версию протокола описывающего сообщения для этого события, уникальный идентификатор события (uuid - по нему удобно отслеживать и логировать обработку события), идентификатор системы отправившей событие, а дальше уже непосредсвенно данные самого события - например информация о созданном заказе.