*/ trait PolicyComparisonTrait { /** * @return array, T|null> */ public static function getPolicyRequiredValues(?int $idSite = null): array { $policyValues = static::getPolicyRequirements(); /** @var class-string $policy */ foreach (array_keys($policyValues) as $policy) { if (!$policy::isActive($idSite)) { $policyValues[$policy] = null; } } return $policyValues; } /** * @param T|null $settingValue * @return T|null */ public static function getPolicyValuesAgainstProvided($settingValue, ?int $idSite = null) { $values = static::getPolicyRequiredValues($idSite); $values[] = $settingValue; return static::getStrictestValueFromArray($values); } /** * @param array $policies * * @return T|null */ protected static function getStrictestValueFromArray(array $policies) { /** @var callable-string */ $callback = [__CLASS__, 'compareValuesHandleNull']; return array_reduce($policies, $callback); } /** * @param T|null $value1 * @param T|null $value2 * * @return T|null */ protected static function compareValuesHandleNull($value1, $value2) { if (is_null($value1)) { return $value2; } if (is_null($value2)) { return $value1; } return static::compareStrictness($value1, $value2); } public static function isControlledBySpecificPolicy(string $policy, ?int $idSite = null): bool { return array_key_exists($policy, self::getPolicyRequiredValues($idSite)); } /** * @param T $value1 * @param T $value2 * * @return T */ abstract protected static function compareStrictness($value1, $value2); }