Replacing a direct call with an event feels like removing coupling. The dependency does not disappear — it moves from a line you can read into a subscriber registration somewhere else, and now nothing in the calling code says what happens next.
// explicit: the sequence is readable and traceable
$order = $this->orders->place($cart);
$this->mailer->sendConfirmation($order);
// dispatched: extensible, and no longer traceable by reading
$this->events->dispatch(new OrderPlaced($order));
That is a good trade when the set of reactions is genuinely open — a plugin architecture, an audit log, anything a third party extends. It is a bad trade for a fixed two-step sequence, where it buys nothing and costs the reader a search across the codebase to find out whether an email is sent. Ask whether anyone other than this module will ever subscribe.