Same name and namespace in other branches
  1. 8.9.x core/lib/Drupal/Core/Access/AccessResult.php \Drupal\Core\Access\AccessResult::andIf()
  2. 9 core/lib/Drupal/Core/Access/AccessResult.php \Drupal\Core\Access\AccessResult::andIf()

Combine this access result with another using AND.

When AND is performed on two access results, the result is:

  • isForbidden() in either ⇒ isForbidden()
  • otherwise, if isAllowed() in both ⇒ isAllowed()
  • otherwise, one of them is isNeutral() ⇒ isNeutral()

Truth table:


  |A N F
--+-----
A |A N F
N |N N F
F |F F F

Parameters

\Drupal\Core\Access\AccessResultInterface $other: The other access result to AND this one with.

Return value

static

Overrides AccessResultInterface::andIf

File

core/lib/Drupal/Core/Access/AccessResult.php, line 343

Class

AccessResult
Value object for passing an access result with cacheability metadata.

Namespace

Drupal\Core\Access

Code

public function andIf(AccessResultInterface $other) {

  // The other access result's cacheability metadata is merged if $merge_other
  // gets set to TRUE. It gets set to TRUE in one case: if the other access
  // result is used.
  $merge_other = FALSE;
  if ($this
    ->isForbidden() || $other
    ->isForbidden()) {
    $result = static::forbidden();
    if (!$this
      ->isForbidden()) {
      if ($other instanceof AccessResultReasonInterface) {
        $result
          ->setReason($other
          ->getReason());
      }
      $merge_other = TRUE;
    }
    else {
      if ($this instanceof AccessResultReasonInterface) {
        $result
          ->setReason($this
          ->getReason());
      }
    }
  }
  elseif ($this
    ->isAllowed() && $other
    ->isAllowed()) {
    $result = static::allowed();
    $merge_other = TRUE;
  }
  else {
    $result = static::neutral();
    if (!$this
      ->isNeutral()) {
      $merge_other = TRUE;
      if ($other instanceof AccessResultReasonInterface) {
        $result
          ->setReason($other
          ->getReason());
      }
    }
    else {
      if ($this instanceof AccessResultReasonInterface) {
        $result
          ->setReason($this
          ->getReason());
      }
    }
  }
  $result
    ->inheritCacheability($this);
  if ($merge_other) {
    $result
      ->inheritCacheability($other);

    // If this access result is not cacheable, then an AND with another access
    // result must also not be cacheable, except if the other access result
    // has isForbidden() === TRUE. isForbidden() access results are contagious
    // in that they propagate regardless of the other value.
    if ($this
      ->getCacheMaxAge() === 0 && !$result
      ->isForbidden()) {
      $result
        ->setCacheMaxAge(0);
    }
  }
  return $result;
}