diff --git a/CRM/Admin/Form/Setting.php b/CRM/Admin/Form/Setting.php index 56d316dcc1f3..5c0b38b6cee3 100644 --- a/CRM/Admin/Form/Setting.php +++ b/CRM/Admin/Form/Setting.php @@ -116,7 +116,7 @@ public function rebuildMenu() { $config = CRM_Core_Config::singleton(TRUE, TRUE); // rebuild menu items - CRM_Core_Menu::store(); + \Civi::router()->rebuild();; } } diff --git a/CRM/Core/Invoke.php b/CRM/Core/Invoke.php index c15d2f6f766d..590c8806114c 100644 --- a/CRM/Core/Invoke.php +++ b/CRM/Core/Invoke.php @@ -141,7 +141,7 @@ public static function getItem($args) { else { $path = $args; } - $item = CRM_Core_Menu::get($path); + $item = \Civi::router()->get($path); return $item; } @@ -242,7 +242,7 @@ public static function runItem($item) { return $result; } - CRM_Core_Menu::store(); + \Civi::router()->rebuild();; CRM_Core_Session::setStatus(ts('Menu has been rebuilt'), ts('Complete'), 'success'); return CRM_Utils_System::redirect(); } diff --git a/CRM/Core/Menu.php b/CRM/Core/Menu.php index 0698d9b849d0..c027c3311925 100644 --- a/CRM/Core/Menu.php +++ b/CRM/Core/Menu.php @@ -332,6 +332,9 @@ public static function isPublicRoute(string $path): bool { return FALSE; } + /** + * @internal + */ public static function clear() { // Take the rebuild lock: TRUNCATE is a writer too, and clearing the table out from under an // in-flight self::store() would leave it holding only the rows that store() inserts after the @@ -360,6 +363,7 @@ private static function clearMenu() { /** * This function recomputes menu from xml and populates civicrm_menu. + * @internal */ public static function store() { // Take the rebuild lock: without it, concurrent rebuilds collide on the (path, domain_id) @@ -622,6 +626,7 @@ public static function fillComponentIds(&$menu, $path) { } /** + * @internal * @param string $path * Path of menu item to retrieve. * diff --git a/CRM/Utils/GuzzleMiddleware.php b/CRM/Utils/GuzzleMiddleware.php index 3ac394761207..3afea212ec87 100644 --- a/CRM/Utils/GuzzleMiddleware.php +++ b/CRM/Utils/GuzzleMiddleware.php @@ -186,7 +186,7 @@ protected static function filterUri(\Psr\Http\Message\UriInterface $oldUri) { } if ($scheme === 'route') { - $menu = CRM_Core_Menu::get($hostPath); + $menu = \Civi::router()->get($hostPath); $scheme = ($menu && !empty($menu['is_public'])) ? 'frontend' : 'backend'; } diff --git a/CRM/Utils/System/DrupalBase.php b/CRM/Utils/System/DrupalBase.php index db9509d3a006..222f3bc8c7e8 100644 --- a/CRM/Utils/System/DrupalBase.php +++ b/CRM/Utils/System/DrupalBase.php @@ -707,7 +707,7 @@ public function isFrontEndPage() { $path = CRM_Utils_System::currentPath() ?? ''; // Get the menu for above URL. - $item = CRM_Core_Menu::get($path); + $item = \Civi::router()->get($path); // In case the URL is not a civicrm page (a drupal page) we set the FE theme to TRUE - covering the corner case return (empty($item) || !empty($item['is_public'])); } diff --git a/Civi.php b/Civi.php index a058985d7894..28c184761871 100644 --- a/Civi.php +++ b/Civi.php @@ -259,6 +259,13 @@ public static function resources() { return CRM_Core_Resources::singleton(); } + /** + * @return Civi\Core\Router + */ + public static function router() { + return \Civi::service('civi.router'); + } + /** * Obtain the contact's personal settings. * diff --git a/Civi/Core/Rebuilder.php b/Civi/Core/Rebuilder.php index 57e2d77ecba5..1c296a7a26cc 100644 --- a/Civi/Core/Rebuilder.php +++ b/Civi/Core/Rebuilder.php @@ -22,7 +22,6 @@ use CRM_Core_DAO; use CRM_Core_DAO_AllCoreTables; use CRM_Core_ManagedEntities; -use CRM_Core_Menu; use CRM_Core_OptionGroup; use CRM_Core_Resources; use CRM_Core_Session; @@ -184,7 +183,7 @@ public function execute(): void { $session->reset(2); } if (!empty($targets['router'])) { - CRM_Core_Menu::store(); + \Civi::router()->rebuild();; } if (!empty($targets['navigation'])) { Civi::cache('navigation')->flush(); diff --git a/Civi/Core/Router.php b/Civi/Core/Router.php new file mode 100644 index 000000000000..81f7294aaa82 --- /dev/null +++ b/Civi/Core/Router.php @@ -0,0 +1,41 @@ +reconcile(E::LONG_NAME); } if ($this->flushMenu) { - \CRM_Core_Menu::clear(); + \Civi::router()->clear();; } } diff --git a/ext/afform/core/Civi/Api4/Utils/AfformSaveTrait.php b/ext/afform/core/Civi/Api4/Utils/AfformSaveTrait.php index 3002db445b9f..62074f67db63 100644 --- a/ext/afform/core/Civi/Api4/Utils/AfformSaveTrait.php +++ b/ext/afform/core/Civi/Api4/Utils/AfformSaveTrait.php @@ -73,7 +73,7 @@ protected function writeRecord($item) { } if (Utils::shouldClearMenuCache($item, $orig ?? [])) { - \CRM_Core_Menu::clear(); + \Civi::router()->clear();; } $item['module_name'] = _afform_angular_module_name($item['name'], 'camel'); diff --git a/ext/afform/core/afform.php b/ext/afform/core/afform.php index ff533a38a657..5d73bbd1fd08 100644 --- a/ext/afform/core/afform.php +++ b/ext/afform/core/afform.php @@ -459,7 +459,7 @@ function afform_civicrm_post($op, $entityName, $id, $object, $params) { // Adding a new custom field to an empty field group may auto-generate afforms with menu routes. // @see Civi\Api4\Action\CustomGroup\GetAfforms::getCustomGroupAfforms if ($op === 'create' && $entityName === 'CustomField') { - \CRM_Core_Menu::clear(); + \Civi::router()->clear();; } } } diff --git a/ext/civi_contribute/Civi/Api4/Service/ContributionTasksProvider.php b/ext/civi_contribute/Civi/Api4/Service/ContributionTasksProvider.php index a1f92e9cc2bd..d014fc09bcf3 100644 --- a/ext/civi_contribute/Civi/Api4/Service/ContributionTasksProvider.php +++ b/ext/civi_contribute/Civi/Api4/Service/ContributionTasksProvider.php @@ -34,7 +34,7 @@ public function addContributionTasks(GenericHookEvent $event): void { foreach (\CRM_Contribute_Task::tasks() as $id => $task) { if (!empty($task['url'])) { $path = explode('?', $task['url'], 2)[0]; - $menu = \CRM_Core_Menu::get($path); + $menu = \Civi::router()->get($path); $key = $menu ? \CRM_Core_Key::get($menu['page_callback'], TRUE) : ''; $event->tasks['Contribution']['contribution.' . $id] = [ diff --git a/ext/civi_member/Civi/Api4/Service/MembershipTasksProvider.php b/ext/civi_member/Civi/Api4/Service/MembershipTasksProvider.php index 6c9dc3d6c97f..579eccf6251b 100644 --- a/ext/civi_member/Civi/Api4/Service/MembershipTasksProvider.php +++ b/ext/civi_member/Civi/Api4/Service/MembershipTasksProvider.php @@ -33,7 +33,7 @@ public function addMembershipTasks(GenericHookEvent $event): void { foreach (\CRM_Member_Task::tasks() as $id => $task) { if (!empty($task['url'])) { $path = explode('?', $task['url'], 2)[0]; - $menu = \CRM_Core_Menu::get($path); + $menu = \Civi::router()->get($path); $key = $menu ? \CRM_Core_Key::get($menu['page_callback'], TRUE) : ''; $event->tasks['Membership']['membership.' . $id] = [ diff --git a/ext/oembed/Civi/Oembed/Oembed.php b/ext/oembed/Civi/Oembed/Oembed.php index ba78f97b6ec0..29fe9230a030 100644 --- a/ext/oembed/Civi/Oembed/Oembed.php +++ b/ext/oembed/Civi/Oembed/Oembed.php @@ -20,7 +20,7 @@ public function create(string $path, array $query = [], array $options = []): ar $options = $this->normalizeOptions($options); $query = $this->findPropagatedParams($query); - $route = \CRM_Core_Menu::get($path); + $route = \Civi::router()->get($path); $result = [ 'type' => 'rich', 'version' => '1.0', diff --git a/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php b/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php index c06ef4876a7f..c19da818d724 100644 --- a/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php +++ b/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php @@ -780,7 +780,7 @@ private function getQfKey(string $pathExpr): ?string { $result = NULL; if ($routeName = parse_url($pathExpr, PHP_URL_PATH)) { - if ($routeItem = \CRM_Core_Menu::get($routeName)) { + if ($routeItem = \Civi::router()->get($routeName)) { if (!empty($routeItem['page_callback'])) { $result = \CRM_Core_Key::get($routeItem['page_callback']); } diff --git a/tests/phpunit/CRM/Core/MenuTest.php b/tests/phpunit/CRM/Core/MenuTest.php index 523db82e744a..64c117795c6b 100644 --- a/tests/phpunit/CRM/Core/MenuTest.php +++ b/tests/phpunit/CRM/Core/MenuTest.php @@ -70,8 +70,8 @@ public function testReadXML_IDS(): void { * stored and loaded. */ public function testModuleData(): void { - CRM_Core_Menu::clear(); - $item = CRM_Core_Menu::get('civicrm/case'); + \Civi::router()->clear(); + $item = \Civi::router()->get('civicrm/case'); $this->assertFalse(isset($item['ids_arguments']['exceptions'])); $this->assertFalse(isset($item['whimsy'])); @@ -80,8 +80,8 @@ public function testModuleData(): void { $items['civicrm/case']['whimsy'] = 'godliness'; }); - CRM_Core_Menu::clear(); - $item = CRM_Core_Menu::get('civicrm/case'); + \Civi::router()->clear(); + $item = \Civi::router()->get('civicrm/case'); $this->assertTrue(in_array('foobar', $item['ids_arguments']['exceptions'])); $this->assertEquals('godliness', $item['whimsy']); }