nodeNameResolver = $nodeNameResolver; $this->phpDocInfoFactory = $phpDocInfoFactory; } public function isControllerClassMethodWithBehaviorAnnotation(\PhpParser\Node\Stmt\ClassMethod $classMethod) : bool { if (!$this->isControllerClassMethod($classMethod)) { return \false; } $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($classMethod); return $phpDocInfo->hasByType(\PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode::class); } private function isControllerClassMethod(\PhpParser\Node\Stmt\ClassMethod $classMethod) : bool { if (!$classMethod->isPublic()) { return \false; } $classLike = $classMethod->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::CLASS_NODE); if (!$classLike instanceof \PhpParser\Node\Stmt\Class_) { return \false; } return $this->hasParentClassController($classLike); } private function hasParentClassController(\PhpParser\Node\Stmt\Class_ $class) : bool { if ($class->extends === null) { return \false; } return $this->nodeNameResolver->isName($class->extends, '#(Controller|Presenter)$#'); } }