class PathValidator in Drupal 9
Same name and namespace in other branches
- 8 core/lib/Drupal/Core/Path/PathValidator.php \Drupal\Core\Path\PathValidator
 
Provides a default path validator and access checker.
Hierarchy
- class \Drupal\Core\Path\PathValidator implements PathValidatorInterface
 
Expanded class hierarchy of PathValidator
1 file declares its use of PathValidator
- PathValidatorTest.php in core/
tests/ Drupal/ Tests/ Core/ Path/ PathValidatorTest.php  
1 string reference to 'PathValidator'
- core.services.yml in core/
core.services.yml  - core/core.services.yml
 
1 service uses PathValidator
File
- core/
lib/ Drupal/ Core/ Path/ PathValidator.php, line 22  
Namespace
Drupal\Core\PathView source
class PathValidator implements PathValidatorInterface {
  /**
   * The access aware router.
   *
   * @var \Drupal\Core\Routing\AccessAwareRouterInterface
   */
  protected $accessAwareRouter;
  /**
   * A router implementation which does not check access.
   *
   * @var \Symfony\Component\Routing\Matcher\UrlMatcherInterface
   */
  protected $accessUnawareRouter;
  /**
   * The current user.
   *
   * @var \Drupal\Core\Session\AccountInterface
   */
  protected $account;
  /**
   * The path processor.
   *
   * @var \Drupal\Core\PathProcessor\InboundPathProcessorInterface
   */
  protected $pathProcessor;
  /**
   * Creates a new PathValidator.
   *
   * @param \Drupal\Core\Routing\AccessAwareRouterInterface $access_aware_router
   *   The access aware router.
   * @param \Symfony\Component\Routing\Matcher\UrlMatcherInterface $access_unaware_router
   *   A router implementation which does not check access.
   * @param \Drupal\Core\Session\AccountInterface $account
   *   The current user.
   * @param \Drupal\Core\PathProcessor\InboundPathProcessorInterface $path_processor
   *   The path processor;
   */
  public function __construct(AccessAwareRouterInterface $access_aware_router, UrlMatcherInterface $access_unaware_router, AccountInterface $account, InboundPathProcessorInterface $path_processor) {
    $this->accessAwareRouter = $access_aware_router;
    $this->accessUnawareRouter = $access_unaware_router;
    $this->account = $account;
    $this->pathProcessor = $path_processor;
  }
  /**
   * {@inheritdoc}
   */
  public function isValid($path) {
    return (bool) $this
      ->getUrlIfValid($path);
  }
  /**
   * {@inheritdoc}
   */
  public function getUrlIfValid($path) {
    return $this
      ->getUrl($path, TRUE);
  }
  /**
   * {@inheritdoc}
   */
  public function getUrlIfValidWithoutAccessCheck($path) {
    return $this
      ->getUrl($path, FALSE);
  }
  /**
   * Helper for getUrlIfValid() and getUrlIfValidWithoutAccessCheck().
   */
  protected function getUrl($path, $access_check) {
    $path = ltrim($path, '/');
    $parsed_url = UrlHelper::parse($path);
    $options = [];
    if (!empty($parsed_url['query'])) {
      $options['query'] = $parsed_url['query'];
    }
    if (!empty($parsed_url['fragment'])) {
      $options['fragment'] = $parsed_url['fragment'];
    }
    if ($parsed_url['path'] == '<front>') {
      return new Url('<front>', [], $options);
    }
    elseif ($parsed_url['path'] == '<none>') {
      return new Url('<none>', [], $options);
    }
    elseif (UrlHelper::isExternal($path) && UrlHelper::isValid($path)) {
      if (empty($parsed_url['path'])) {
        return FALSE;
      }
      return Url::fromUri($path);
    }
    $request = Request::create('/' . $path);
    $attributes = $this
      ->getPathAttributes($path, $request, $access_check);
    if (!$attributes) {
      return FALSE;
    }
    $route_name = $attributes[RouteObjectInterface::ROUTE_NAME];
    $route_parameters = $attributes['_raw_variables']
      ->all();
    return new Url($route_name, $route_parameters, $options + [
      'query' => $request->query
        ->all(),
    ]);
  }
  /**
   * Gets the matched attributes for a given path.
   *
   * @param string $path
   *   The path to check.
   * @param \Symfony\Component\HttpFoundation\Request $request
   *   A request object with the given path.
   * @param bool $access_check
   *   If FALSE then skip access check and check only whether the path is
   *   valid.
   *
   * @return array|bool
   *   An array of request attributes or FALSE if an exception was thrown.
   */
  protected function getPathAttributes($path, Request $request, $access_check) {
    if (!$access_check || $this->account
      ->hasPermission('link to any page')) {
      $router = $this->accessUnawareRouter;
    }
    else {
      $router = $this->accessAwareRouter;
    }
    $initial_request_context = $router
      ->getContext() ? $router
      ->getContext() : new RequestContext();
    $path = $this->pathProcessor
      ->processInbound('/' . $path, $request);
    try {
      $request_context = new RequestContext();
      $request_context
        ->fromRequest($request);
      $router
        ->setContext($request_context);
      $result = $router
        ->match($path);
    } catch (ResourceNotFoundException $e) {
      $result = FALSE;
    } catch (ParamNotConvertedException $e) {
      $result = FALSE;
    } catch (AccessDeniedHttpException $e) {
      $result = FALSE;
    } catch (MethodNotAllowedException $e) {
      $result = FALSE;
    }
    $router
      ->setContext($initial_request_context);
    return $result;
  }
}Members
| 
            Name | 
                  Modifiers | Type | Description | Overrides | 
|---|---|---|---|---|
| 
            PathValidator:: | 
                  protected | property | The access aware router. | |
| 
            PathValidator:: | 
                  protected | property | A router implementation which does not check access. | |
| 
            PathValidator:: | 
                  protected | property | The current user. | |
| 
            PathValidator:: | 
                  protected | property | The path processor. | |
| 
            PathValidator:: | 
                  protected | function | Gets the matched attributes for a given path. | |
| 
            PathValidator:: | 
                  protected | function | Helper for getUrlIfValid() and getUrlIfValidWithoutAccessCheck(). | |
| 
            PathValidator:: | 
                  public | function | 
            Returns a URL object, if the path is valid and accessible. Overrides PathValidatorInterface:: | 
                  |
| 
            PathValidator:: | 
                  public | function | 
            Returns a URL object, if the path is valid. Overrides PathValidatorInterface:: | 
                  |
| 
            PathValidator:: | 
                  public | function | 
            Checks if the URL path is valid and accessible by the current user. Overrides PathValidatorInterface:: | 
                  |
| 
            PathValidator:: | 
                  public | function | Creates a new PathValidator. |