diff --git a/src/Rules/Symfony/NoBareAndSecurityIsGrantedContentsRule.php b/src/Rules/Symfony/NoBareAndSecurityIsGrantedContentsRule.php index 45cdc0ac1..2ae98756b 100644 --- a/src/Rules/Symfony/NoBareAndSecurityIsGrantedContentsRule.php +++ b/src/Rules/Symfony/NoBareAndSecurityIsGrantedContentsRule.php @@ -51,10 +51,37 @@ public function processNode(Node $node, Scope $scope): array return []; } + if ($this->usesCustomFunctios($attributeExpr)) { + return []; + } + $identifierRuleError = RuleErrorBuilder::message(self::ERROR_MESSAGE) ->identifier(SymfonyRuleIdentifier::REQUIRED_IS_GRANTED_ENUM) ->build(); return [$identifierRuleError]; } + + private function usesCustomFunctios(String_ $string): bool + { + $joinedItems = preg_split('# (and|&&|or) #', $string->value, -1, PREG_SPLIT_NO_EMPTY); + + if ($joinedItems === false) { + return false; + } + + foreach ($joinedItems as $joinedItem) { + if (str_contains($joinedItem, 'is_granted')) { + continue; + } + + if (str_contains($joinedItem, 'has_role')) { + continue; + } + + return true; + } + + return false; + } } diff --git a/tests/Rules/Symfony/NoBareAndSecurityIsGrantedContentsRule/Fixture/SkipCustomFunction.php b/tests/Rules/Symfony/NoBareAndSecurityIsGrantedContentsRule/Fixture/SkipCustomFunction.php new file mode 100644 index 000000000..135428908 --- /dev/null +++ b/tests/Rules/Symfony/NoBareAndSecurityIsGrantedContentsRule/Fixture/SkipCustomFunction.php @@ -0,0 +1,15 @@ +