Civi::dispatcher() - Close loopholes that occur during early boot
authorTim Otten <totten@civicrm.org>
Tue, 14 Jul 2020 07:06:46 +0000 (00:06 -0700)
committerTim Otten <totten@civicrm.org>
Tue, 14 Jul 2020 10:54:32 +0000 (03:54 -0700)
commit42ccedc7c6bdba553c36462d923f887aeb632e18
tree262ebb7c8768777c75e42c6a2bebc4255cecf8e4
parenta7718acbe04134efd4f7b67626c44d17f26b2ead
Civi::dispatcher() - Close loopholes that occur during early boot

Before
------

* The event-dispatcher is fully instantiated as a container service (`Container::createEventDispatcher()`).
* It is not possible to add listeners to `Civi::dispatcher()` before the container is instantiated.
* It is not possible to add listeners to `Civi::dispatcher()` in the top-level logic of an extension file (`myext.php`)
* There is a distinction between "pre-boot" hooks (`hook_civicrm_container` or `hook_civicrm_entityType`) and
  normal hooks. Pre-boot hooks do not work with `Civi::dispatcher()`.

After
-----

* The event-dispatcher is instantiated as boot service (ie very early during bootstrap).
* To preserve compatibility (with `RegisterListenersPass`, with any downstream modifications of `createEventDispatcher`,
  and with any dependency-injection) the event-dispatcher will still use `createEventDispatcher()` for extra
  intialization.
* It is possible to add listeners to `Civi::dispatcher()` in several more places, e.g.
  at the top-level of an extension's `.php` file and in `CRM_Utils_System_*::initialize()`
* There is no distinction between "preboot" hooks and normal hooks. `Civi::dispatcher()` can
  register listeners for all hooks.
* To ensure that we do not accidentally re-create "preboot" hooks, this patch enables a
  "dispatch policy" => if any hook fires too early, it will throw an exception.
CRM/Utils/Hook.php
Civi.php
Civi/Core/CiviEventDispatcher.php
Civi/Core/Container.php