diff --git a/src/applications/base/PhabricatorApplication.php b/src/applications/base/PhabricatorApplication.php index 03f14a241b..1f605476bc 100644 --- a/src/applications/base/PhabricatorApplication.php +++ b/src/applications/base/PhabricatorApplication.php @@ -449,14 +449,25 @@ abstract class PhabricatorApplication $class, PhabricatorUser $viewer) { - if (!self::isClassInstalled($class)) { - return false; + $cache = PhabricatorCaches::getRequestCache(); + $viewer_phid = $viewer->getPHID(); + $key = 'app.'.$class.'.installed.'.$viewer_phid; + + $result = $cache->getKey($key); + if ($result === null) { + if (!self::isClassInstalled($class)) { + $result = false; + } else { + $result = PhabricatorPolicyFilter::hasCapability( + $viewer, + self::getByClass($class), + PhabricatorPolicyCapability::CAN_VIEW); + } + + $cache->setKey($key, $result); } - return PhabricatorPolicyFilter::hasCapability( - $viewer, - self::getByClass($class), - PhabricatorPolicyCapability::CAN_VIEW); + return $result; } diff --git a/src/infrastructure/query/policy/PhabricatorPolicyAwareQuery.php b/src/infrastructure/query/policy/PhabricatorPolicyAwareQuery.php index e7b9b35628..30b7b8dd0e 100644 --- a/src/infrastructure/query/policy/PhabricatorPolicyAwareQuery.php +++ b/src/infrastructure/query/policy/PhabricatorPolicyAwareQuery.php @@ -35,7 +35,6 @@ abstract class PhabricatorPolicyAwareQuery extends PhabricatorOffsetPagedQuery { private $workspace = array(); private $inFlightPHIDs = array(); private $policyFilteredPHIDs = array(); - private $canUseApplication; /** * Should we continue or throw an exception when a query result is filtered @@ -679,21 +678,13 @@ abstract class PhabricatorPolicyAwareQuery extends PhabricatorOffsetPagedQuery { * execute the query. */ public function canViewerUseQueryApplication() { - if ($this->canUseApplication === null) { - $class = $this->getQueryApplicationClass(); - if (!$class) { - $this->canUseApplication = true; - } else { - $result = id(new PhabricatorApplicationQuery()) - ->setViewer($this->getViewer()) - ->withClasses(array($class)) - ->execute(); - - $this->canUseApplication = (bool)$result; - } + $class = $this->getQueryApplicationClass(); + if (!$class) { + return true; } - return $this->canUseApplication; + $viewer = $this->getViewer(); + return PhabricatorApplication::isClassInstalledForViewer($class, $viewer); } }