function AccessResult::andIf

Same name in other branches
  1. 8.9.x core/lib/Drupal/Core/Access/AccessResult.php \Drupal\Core\Access\AccessResult::andIf()
  2. 10 core/lib/Drupal/Core/Access/AccessResult.php \Drupal\Core\Access\AccessResult::andIf()
  3. 11.x core/lib/Drupal/Core/Access/AccessResult.php \Drupal\Core\Access\AccessResult::andIf()

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;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.