You are here

protected function EasyBreadcrumbBuilder::getRequestForPath in Easy Breadcrumb 8

Same name and namespace in other branches
  1. 2.x src/EasyBreadcrumbBuilder.php \Drupal\easy_breadcrumb\EasyBreadcrumbBuilder::getRequestForPath()

Matches a path in the router.

Parameters

string $path: The request path with a leading slash.

array $exclude: An array of paths or system paths to skip.

Return value

\Symfony\Component\HttpFoundation\Request A populated request object or NULL if the path couldn't be matched.

2 calls to EasyBreadcrumbBuilder::getRequestForPath()
EasyBreadcrumbBuilder::build in src/EasyBreadcrumbBuilder.php
Builds the breadcrumb.
EasyBreadcrumbBuilder::setRouteContextFromRouteMatch in src/EasyBreadcrumbBuilder.php
Set request context from passed in $route_match if route is available.

File

src/EasyBreadcrumbBuilder.php, line 822

Class

EasyBreadcrumbBuilder
Primary implementation for the Easy Breadcrumb builder.

Namespace

Drupal\easy_breadcrumb

Code

protected function getRequestForPath($path, array $exclude) {
  if (!empty($exclude[$path])) {
    return NULL;
  }

  // Check to see if the path is actually a redirect, if it is, resolve it to
  // its source before we create the request.  Strip the starting slash,
  // redirect module doesn't include it.
  if ($this->moduleHandler
    ->moduleExists('redirect') && $this->config
    ->get(EasyBreadcrumbConstants::FOLLOW_REDIRECTS)) {
    $redirect_path = $path;
    if ($redirect_path[0] === '/') {
      $redirect_path = substr($redirect_path, 1);
    }
    $language_prefix = $this->languageManager
      ->getCurrentLanguage()
      ->getId();
    if (strpos($redirect_path, "{$language_prefix}/") === 0) {
      $redirect_path = substr($redirect_path, strlen("{$language_prefix}/"));
    }
    $redirects = \Drupal::service('redirect.repository')
      ->findBySourcePath($redirect_path);
    if (!empty($redirects)) {

      // Take the first redirect if we have multiple, there should normally
      // only be one redirect for a source.

      /** @var \Drupal\redirect\Entity\Redirect $redirect */
      $redirect = current($redirects);
      $path = $redirect
        ->getRedirectUrl()
        ->toString();
    }
  }

  // @todo Use the RequestHelper once https://www.drupal.org/node/2090293 is
  // fixed.
  $request = Request::create($path);

  // Performance optimization: set a short accept header to reduce overhead in
  // AcceptHeaderMatcher when matching the request.
  $request->headers
    ->set('Accept', 'text/html');

  // Find the system path by resolving aliases, language prefix, etc.
  $processed = $this->pathProcessor
    ->processInbound($path, $request);
  if (empty($processed) || !empty($exclude[$processed])) {

    // This resolves to the front page, which we already add.
    return NULL;
  }
  $this->currentPath
    ->setPath($processed, $request);

  // Attempt to match this path to provide a fully built request.
  try {
    $request->attributes
      ->add($this->router
      ->matchRequest($request));
    return $request;
  } catch (ParamNotConvertedException $e) {
    return NULL;
  } catch (ResourceNotFoundException $e) {
    return NULL;
  } catch (MethodNotAllowedException $e) {
    return NULL;
  } catch (AccessDeniedHttpException $e) {
    return NULL;
  }
}