An event between modules, and the coupling it did not remove

Replacing a direct call with an event felt like decoupling, and the two modules were still deployed together, released together, and broken together.

// before
$this->billing->createInvoice($order);

// after
$this->events->dispatch(new OrderPlaced($order->id()));

// what changed: the direction of the compile-time dependency
// what did not: billing still must handle OrderPlaced, the
// payload is still an ordering contract, and a change to it
// still breaks both.

An event removes a compile-time dependency and replaces it with a payload contract, which is a real gain when the two sides can be deployed independently and close to nothing when they cannot. What it definitely adds is a control flow nobody can follow by reading — the honest reason to do it inside a monolith is to make a future extraction possible, and that is worth saying out loud rather than calling it decoupling.