hasDefinition(RateLimitRegistry::class)) { return; } $registryDefinition = $container->findDefinition(RateLimitRegistry::class); foreach ($container->findTaggedServiceIds($this->tagName) as $serviceName => $tags) { $definition = $container->findDefinition($serviceName); if ($definition->isAbstract()) { continue; } $className = $definition->getClass() ?? $serviceName; $reflectionClass = $container->getReflectionClass($className); if ($reflectionClass === null) { continue; } foreach ($reflectionClass->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) { if (!str_ends_with($method->getName(), 'Action')) { continue; } $attributes = $method->getAttributes(RateLimit::class); if ($attributes === []) { continue; } $rateLimit = $attributes[0]->newInstance(); $registryDefinition->addMethodCall('add', [ $className, $method->getName(), $rateLimit->limit, $rateLimit->interval, $rateLimit->policy, $rateLimit->message, ]); } } } }