Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
(dev/core#3660) Ensure that rebuildMenuAndCaches has current mixins+c…
…lassloaders Overview -------- This fixes an issue in transitioning from `hook_managed` to `mixin/mgd-php@1`, wherein managed-entities are briefly deleted (but later recreated). Steps to Reproduce ------------------ 1. (Web) Install an extension with a revision that uses `hook_managed` 2. (CLI) Switch the extension to a revision that uses `mixin/mgd-php@1` 3. (CLI) View contents of `civicrm_managed` 4. (Web) Run `civicrm/menu/rebuild` 5. (CLI) View contents of `civicrm_managed` 6. (Web) Run `civicrm/menu/rebuild` 7. (CLI) View contents of `civicrm_managed` Before ------ While processing step 4 (`civicrm/menu/rebuild`), it fails to run the hooks for `mgd-php`. Consequently, the list of managed-entities is lost and will disappear at step 5. After ----- While processing step 4 (`civicrm/menu/rebuild`), it activates the hooks for `mgd-php`. Technical Details ------------------ When processing `civicrm/menu/rebuild`, there are a couple big substeps: * `Civi\Core\Container::boot()` - During this process, it loads extensions. As usual, this reads cached metadata, sets up classloaders, sets up mixins/hooks, etc. * `CRM_Core_Invoke::rebuildMenuAndCaches()` - During this process, it clears out caches and rebuilds several things (menus, managed-entities, etc). The problem is this: * The cache used during `boot()` has stale metadata (specifically, `civicrm_cache` has old values of `mixinScan` and `mixinBoot`). So it doesn't setup any new mixins/hooks. * Then `rebuildMenuAndCaches()` depends on the mixins/hooks that are already setup. While the function does clear persistent caches, it assumes that the PHP runtime environment is up-to-spec. But it's not -- becuase our hooks were based on the caches. The patch uses the same `refresh()` mechanism as the extension-administration subsystem (which has to reset the classloaders+mixins after enabling or disabling an extension).
- Loading branch information