micro_menu-8.x-1.0-alpha4/src/Routing/RouteProcessor.php

src/Routing/RouteProcessor.php
<?php

namespace Drupal\micro_menu\Routing;

use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Render\BubbleableMetadata;
use Drupal\Core\RouteProcessor\OutboundRouteProcessorInterface;
use Drupal\micro_site\Entity\SiteInterface;
use Drupal\system\MenuInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\RequestStack;

/**
 * Processes the outbound path by resolving it to the site entity menu route.
 */
class RouteProcessor implements OutboundRouteProcessorInterface {

  /**
   * The config factory.
   *
   * @var \Drupal\Core\Config\ConfigFactoryInterface
   */
  protected $configFactory;

  /**
   * The entity type manager service.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * The request stack object.
   *
   * @var \Symfony\Component\HttpFoundation\RequestStack
   */
  protected $requestStack;

  /**
   * Constructs a RouteProcessor object.
   *
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   *   The config factory.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   The entity type manager service.
   * @param \Symfony\Component\HttpFoundation\RequestStack $requestStack
   *   The request stack object.
   */
  function __construct(ConfigFactoryInterface $config_factory, EntityTypeManagerInterface $entity_type_manager, RequestStack $requestStack) {
    $this->configFactory = $config_factory;
    $this->entityTypeManager = $entity_type_manager;
    $this->requestStack = $requestStack;
  }

  /**
   * {@inheritdoc}
   */
  public function processOutbound($route_name, Route $route, array &$parameters, BubbleableMetadata $bubbleable_metadata = NULL) {
    $routes_to_check =[
      'entity.menu_link_content.canonical',
      'entity.menu_link_content.edit_form',
      'entity.menu_link_content.delete_form',
      'entity.menu.add_link_form',
      'entity.menu.edit_form',
      'entity.menu_link_content.content_translation_overview',
      'entity.menu_link_content.content_translation_add',
    ];

    if (in_array($route_name, $routes_to_check)) {
      $request = $this->requestStack->getCurrentRequest();
      /** @var \Drupal\micro_site\Entity\SiteInterface $site */
      $site = $request->get('site');
      /** @var \Drupal\system\MenuInterface $menu */
      $menu = $request->get('menu');

      // @TODO test if the active site is retrieved when we are on the site url.
      // Take over URI construction for menu link.
      if ($site instanceof SiteInterface && $menu instanceof MenuInterface) {
        switch ($route_name) {
          case 'entity.menu_link_content.canonical':
          case 'entity.menu_link_content.edit_form':
            $route->setPath('/site/{site}/menu/{menu}/item/{menu_link_content}/edit');
            break;

          case 'entity.menu_link_content.delete_form':
            $route->setPath('/site/{site}/menu/{menu}/item/{menu_link_content}/delete');
            break;

          case 'entity.menu.add_link_form':
            $route->setPath('/site/{site}/menu/{menu}/add');
            break;

          case 'entity.menu.edit_form':
            $route->setPath('/site/{site}/menu/{menu}');
            break;

          case 'entity.menu_link_content.content_translation_overview':
            $route->setPath('/site/{site}/menu/{menu}/item/{menu_link_content}/edit/translations');
            break;

          case 'entity.menu_link_content.content_translation_add':
            $route->setPath('/site/{site}/menu/{menu}/item/{menu_link_content}/edit/add/{source}/{target}');
            break;
        }

        $route_parameters = $route->getOption('parameters');
        $route_parameters += $this->getSiteMenuParameters();
        $route->setOption('parameters', $route_parameters);

        // Provide the parameters to the route altered.
        $parameters['site'] = $site->id();
        $parameters['menu'] = $menu->id();
      }
    }

  }

  /**
   * Helper function to get default parameters for site menu route.
   *
   * @return array $options
   *   The default options for a menu in a site context route.
   */
  protected function getSiteMenuParameters() {
    $parameters = [];
    $parameters['site'] = [
      'type' => 'entity:site',
      'with_config_overrides' => TRUE,
    ];
    $parameters['menu'] = [
      'type' => 'entity:menu',
      'with_config_overrides' => TRUE,
    ];
    return $parameters;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc