Files
socialhose-php/src/CacheBundle/DependencyInjection/Compiler/CollectFeedFetchersCompilerPass.php
T
2022-12-09 08:36:26 -06:00

66 lines
2.0 KiB
PHP

<?php
namespace CacheBundle\DependencyInjection\Compiler;
use CacheBundle\Feed\Fetcher\Factory\LazyFeedFetcherFactory;
use CacheBundle\Feed\Fetcher\FeedFetcherInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
/**
* Class CollectFeedFetchersCompilerPass
* @package CacheBundle\DependencyInjection\Compiler
*/
class CollectFeedFetchersCompilerPass implements CompilerPassInterface
{
const LAZY_FACTORY_ID = 'cache.feed_fetcher_factory.lazy';
/**
* You can modify the container here before it is dumped to PHP code.
*
* @param ContainerBuilder $container A ContainerBuilder instance.
*
* @return void
*/
public function process(ContainerBuilder $container)
{
if (! $container->has(self::LAZY_FACTORY_ID)) {
$this->throwException('Lazy factory not registered.');
}
$lazyFactory = $container->getDefinition(self::LAZY_FACTORY_ID);
if ($lazyFactory->getClass() !== LazyFeedFetcherFactory::class) {
$this->throwException(
'Invalid factory, expected '. LazyFeedFetcherFactory::class
.' but got '. $lazyFactory->getClass()
);
}
$fetchers = array_keys($container->findTaggedServiceIds('socialhose.feed_fetcher'));
$map = [];
foreach ($fetchers as $id) {
$class = $container->getDefinition($id)->getClass();
$reflection = new \ReflectionClass($class);
if (! $reflection->implementsInterface(FeedFetcherInterface::class)) {
$this->throwException('');
}
$map[$class::support()] = $id;
}
$lazyFactory->replaceArgument(1, $map);
}
/**
* @param string $message A additional exception message.
*
* @return void
*/
private function throwException($message = '')
{
throw new \RuntimeException('Can\'t register feed fetchers in lazy factory. '. $message);
}
}