66 lines
2.0 KiB
PHP
66 lines
2.0 KiB
PHP
|
<?php
|
||
|
|
||
|
/*
|
||
|
* This file is part of the Symfony package.
|
||
|
*
|
||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||
|
*
|
||
|
* For the full copyright and license information, please view the LICENSE
|
||
|
* file that was distributed with this source code.
|
||
|
*/
|
||
|
|
||
|
namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
|
||
|
|
||
|
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
|
||
|
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||
|
use Symfony\Component\DependencyInjection\Reference;
|
||
|
|
||
|
/**
|
||
|
* Gathers and configures the argument value resolvers.
|
||
|
*
|
||
|
* @author Iltar van der Berg <kjarli@gmail.com>
|
||
|
*/
|
||
|
class ControllerArgumentValueResolverPass implements CompilerPassInterface
|
||
|
{
|
||
|
public function process(ContainerBuilder $container)
|
||
|
{
|
||
|
if (!$container->hasDefinition('argument_resolver')) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$definition = $container->getDefinition('argument_resolver');
|
||
|
$argumentResolvers = $this->findAndSortTaggedServices('controller_argument.value_resolver', $container);
|
||
|
$definition->replaceArgument(1, $argumentResolvers);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Finds all services with the given tag name and order them by their priority.
|
||
|
*
|
||
|
* @param string $tagName
|
||
|
* @param ContainerBuilder $container
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
private function findAndSortTaggedServices($tagName, ContainerBuilder $container)
|
||
|
{
|
||
|
$services = $container->findTaggedServiceIds($tagName);
|
||
|
|
||
|
$sortedServices = array();
|
||
|
foreach ($services as $serviceId => $tags) {
|
||
|
foreach ($tags as $attributes) {
|
||
|
$priority = isset($attributes['priority']) ? $attributes['priority'] : 0;
|
||
|
$sortedServices[$priority][] = new Reference($serviceId);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (empty($sortedServices)) {
|
||
|
return array();
|
||
|
}
|
||
|
|
||
|
krsort($sortedServices);
|
||
|
|
||
|
// Flatten the array
|
||
|
return call_user_func_array('array_merge', $sortedServices);
|
||
|
}
|
||
|
}
|