Verified Commit 0beb71bd authored by Dave Long's avatar Dave Long
Browse files

Issue #3363421 by vbouchet, kim.pepper, smustgrave: Use CallableResolver for...

Issue #3363421 by vbouchet, kim.pepper, smustgrave: Use CallableResolver for \Drupal\Core\Menu\MenuLinkTree::transform()
parent a39939bb
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -774,7 +774,7 @@ services:
  Drupal\Core\Menu\MenuLinkManagerInterface: '@plugin.manager.menu.link'
  menu.link_tree:
    class: Drupal\Core\Menu\MenuLinkTree
    arguments: ['@menu.tree_storage', '@plugin.manager.menu.link', '@router.route_provider', '@menu.active_trail', '@controller_resolver']
    arguments: ['@menu.tree_storage', '@plugin.manager.menu.link', '@router.route_provider', '@menu.active_trail', '@callable_resolver']
  Drupal\Core\Menu\MenuLinkTreeInterface: '@menu.link_tree'
  menu.default_tree_manipulators:
    class: Drupal\Core\Menu\DefaultMenuLinkTreeManipulators
+13 −9
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@
use Drupal\Core\Routing\PreloadableRouteProviderInterface;
use Drupal\Core\Routing\RouteProviderInterface;
use Drupal\Core\Template\Attribute;
use Drupal\Core\Utility\CallableResolver;

/**
 * Implements the loading, transforming and rendering of menu link trees.
@@ -44,11 +45,11 @@ class MenuLinkTree implements MenuLinkTreeInterface {
  protected $menuActiveTrail;

  /**
   * The controller resolver.
   * The callable resolver.
   *
   * @var \Drupal\Core\Controller\ControllerResolverInterface
   * @var \Drupal\Core\Utility\CallableResolver
   */
  protected $controllerResolver;
  protected CallableResolver $callableResolver;

  /**
   * Constructs a \Drupal\Core\Menu\MenuLinkTree object.
@@ -61,15 +62,19 @@ class MenuLinkTree implements MenuLinkTreeInterface {
   *   The route provider to load routes by name.
   * @param \Drupal\Core\Menu\MenuActiveTrailInterface $menu_active_trail
   *   The active menu trail service.
   * @param \Drupal\Core\Controller\ControllerResolverInterface $controller_resolver
   *   The controller resolver.
   * @param \Drupal\Core\Utility\CallableResolver|\Drupal\Core\Controller\ControllerResolverInterface $callable_resolver
   *   The callable resolver.
   */
  public function __construct(MenuTreeStorageInterface $tree_storage, MenuLinkManagerInterface $menu_link_manager, RouteProviderInterface $route_provider, MenuActiveTrailInterface $menu_active_trail, ControllerResolverInterface $controller_resolver) {
  public function __construct(MenuTreeStorageInterface $tree_storage, MenuLinkManagerInterface $menu_link_manager, RouteProviderInterface $route_provider, MenuActiveTrailInterface $menu_active_trail, ControllerResolverInterface|CallableResolver $callable_resolver) {
    $this->treeStorage = $tree_storage;
    $this->menuLinkManager = $menu_link_manager;
    $this->routeProvider = $route_provider;
    $this->menuActiveTrail = $menu_active_trail;
    $this->controllerResolver = $controller_resolver;
    if ($callable_resolver instanceof ControllerResolverInterface) {
      @trigger_error('Calling ' . __METHOD__ . '() with an argument of ControllerResolverInterface is deprecated in drupal:10.2.0 and is removed in drupal:11.0.0. Use \Drupal\Core\Utility\CallableResolver instead. See https://www.drupal.org/node/3395294', E_USER_DEPRECATED);
      $callable_resolver = \Drupal::service('callable_resolver');
    }
    $this->callableResolver = $callable_resolver;
  }

  /**
@@ -137,8 +142,7 @@ protected function createInstances(array $data_tree) {
   */
  public function transform(array $tree, array $manipulators) {
    foreach ($manipulators as $manipulator) {
      $callable = $manipulator['callable'];
      $callable = $this->controllerResolver->getControllerFromDefinition($callable);
      $callable = $this->callableResolver->getCallableFromDefinition($manipulator['callable']);
      // Prepare the arguments for the menu tree manipulator callable; the first
      // argument is always the menu link tree.
      if (isset($manipulator['args'])) {
+1 −1
Original line number Diff line number Diff line
@@ -68,7 +68,7 @@ public function load($menu_name, MenuTreeParameters $parameters);
   * @param array $manipulators
   *   The menu link tree manipulators to apply. Each is an array with keys:
   *   - callable: a callable or a string that can be resolved to a callable
   *     by \Drupal\Core\Controller\ControllerResolverInterface::getControllerFromDefinition()
   *     by Drupal\Core\Utility\CallableResolver::getCallableFromDefinition()
   *   - args: optional array of arguments to pass to the callable after $tree.
   *
   * @return \Drupal\Core\Menu\MenuLinkTreeElement[]
+2 −1
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@
use Drupal\Core\Menu\MenuLinkTreeElement;
use Drupal\Core\Template\Attribute;
use Drupal\Core\Url;
use Drupal\Core\Utility\CallableResolver;
use Drupal\Tests\Core\Menu\MenuLinkMock;
use Drupal\Tests\UnitTestCase;

@@ -36,7 +37,7 @@ protected function setUp(): void {
      $this->createMock('\Drupal\Core\Menu\MenuLinkManagerInterface'),
      $this->createMock('\Drupal\Core\Routing\RouteProviderInterface'),
      $this->createMock('\Drupal\Core\Menu\MenuActiveTrailInterface'),
      $this->createMock('\Drupal\Core\Controller\ControllerResolverInterface')
      $this->createMock(CallableResolver::class)
    );

    $cache_contexts_manager = $this->getMockBuilder('Drupal\Core\Cache\Context\CacheContextsManager')
+1 −1
Original line number Diff line number Diff line
@@ -11,4 +11,4 @@ services:
      - { name: page_cache_request_policy }
  toolbar.menu_tree:
    class: Drupal\toolbar\Menu\ToolbarMenuLinkTree
    arguments: ['@menu.tree_storage', '@plugin.manager.menu.link', '@router.route_provider', '@menu.active_trail', '@controller_resolver']
    arguments: ['@menu.tree_storage', '@plugin.manager.menu.link', '@router.route_provider', '@menu.active_trail', '@callable_resolver']