bug #19049 [DependencyInjection] fix the sorting by priority (xabbuh)
This PR was merged into the 3.2-dev branch.
Discussion
----------
[DependencyInjection] fix the sorting by priority
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | yes
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #18482
| License | MIT
| Doc PR |
Commits
-------
6f72657
[DependencyInjection] fix the sorting by priority
This commit is contained in:
commit
5280d5dc9c
@ -20,7 +20,7 @@
|
|||||||
"symfony/asset": "~2.8|~3.0",
|
"symfony/asset": "~2.8|~3.0",
|
||||||
"symfony/cache": "~3.1",
|
"symfony/cache": "~3.1",
|
||||||
"symfony/class-loader": "~2.8|~3.0",
|
"symfony/class-loader": "~2.8|~3.0",
|
||||||
"symfony/dependency-injection": "~3.1",
|
"symfony/dependency-injection": "~3.2",
|
||||||
"symfony/config": "~2.8|~3.0",
|
"symfony/config": "~2.8|~3.0",
|
||||||
"symfony/event-dispatcher": "~2.8|~3.0",
|
"symfony/event-dispatcher": "~2.8|~3.0",
|
||||||
"symfony/http-foundation": "~3.1",
|
"symfony/http-foundation": "~3.1",
|
||||||
|
@ -38,10 +38,10 @@ trait PriorityTaggedServiceTrait
|
|||||||
foreach ($services as $serviceId => $tags) {
|
foreach ($services as $serviceId => $tags) {
|
||||||
foreach ($tags as $attributes) {
|
foreach ($tags as $attributes) {
|
||||||
$priority = isset($attributes['priority']) ? $attributes['priority'] : 0;
|
$priority = isset($attributes['priority']) ? $attributes['priority'] : 0;
|
||||||
$queue->insert(new Reference($serviceId), $priority * -1);
|
$queue->insert(new Reference($serviceId), $priority);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return iterator_to_array($queue);
|
return iterator_to_array($queue, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,85 +0,0 @@
|
|||||||
<?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\Component\DependencyInjection\Tests\Compiler;
|
|
||||||
|
|
||||||
use Symfony\Component\DependencyInjection\Compiler\PriorityTaggedServiceTrait;
|
|
||||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
|
||||||
use Symfony\Component\DependencyInjection\Reference;
|
|
||||||
|
|
||||||
class PriorityTaggedServiceTraitTest extends \PHPUnit_Framework_TestCase
|
|
||||||
{
|
|
||||||
public function testThatCacheWarmersAreProcessedInPriorityOrder()
|
|
||||||
{
|
|
||||||
$services = array(
|
|
||||||
'my_service1' => array(array('priority' => 100)),
|
|
||||||
'my_service2' => array(array('priority' => 200)),
|
|
||||||
'my_service3' => array(array('priority' => -500)),
|
|
||||||
'my_service4' => array(array()),
|
|
||||||
'my_service5' => array(array()),
|
|
||||||
'my_service6' => array(array('priority' => -500)),
|
|
||||||
'my_service7' => array(array('priority' => -499)),
|
|
||||||
'my_service8' => array(array('priority' => 1)),
|
|
||||||
'my_service9' => array(array()),
|
|
||||||
'my_service10' => array(array('priority' => -1000)),
|
|
||||||
'my_service11' => array(array('priority' => -1000)),
|
|
||||||
'my_service12' => array(array('priority' => -1000)),
|
|
||||||
'my_service13' => array(array('priority' => -1000)),
|
|
||||||
);
|
|
||||||
|
|
||||||
$definition = $this->getMock('Symfony\Component\DependencyInjection\Definition');
|
|
||||||
$container = $this->getMock(
|
|
||||||
'Symfony\Component\DependencyInjection\ContainerBuilder',
|
|
||||||
array('findTaggedServiceIds', 'getDefinition', 'hasDefinition')
|
|
||||||
);
|
|
||||||
|
|
||||||
$container
|
|
||||||
->expects($this->atLeastOnce())
|
|
||||||
->method('findTaggedServiceIds')
|
|
||||||
->will($this->returnValue($services));
|
|
||||||
$container
|
|
||||||
->expects($this->atLeastOnce())
|
|
||||||
->method('getDefinition')
|
|
||||||
->with('my_custom_tag')
|
|
||||||
->will($this->returnValue($definition));
|
|
||||||
|
|
||||||
$definition
|
|
||||||
->expects($this->once())
|
|
||||||
->method('replaceArgument')
|
|
||||||
->with(0, array(
|
|
||||||
new Reference('my_service2'),
|
|
||||||
new Reference('my_service1'),
|
|
||||||
new Reference('my_service8'),
|
|
||||||
new Reference('my_service4'),
|
|
||||||
new Reference('my_service5'),
|
|
||||||
new Reference('my_service9'),
|
|
||||||
new Reference('my_service7'),
|
|
||||||
new Reference('my_service3'),
|
|
||||||
new Reference('my_service6'),
|
|
||||||
new Reference('my_service10'),
|
|
||||||
new Reference('my_service11'),
|
|
||||||
new Reference('my_service12'),
|
|
||||||
new Reference('my_service13'),
|
|
||||||
));
|
|
||||||
|
|
||||||
(new PriorityTaggedServiceTraitImplementation())->test('my_custom_tag', $container);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class PriorityTaggedServiceTraitImplementation
|
|
||||||
{
|
|
||||||
use PriorityTaggedServiceTrait;
|
|
||||||
|
|
||||||
public function test($tagName, ContainerBuilder $container)
|
|
||||||
{
|
|
||||||
return $this->findAndSortTaggedServices($tagName, $container);
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,78 @@
|
|||||||
|
<?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\Component\DependencyInjection\Tests\Compiler;
|
||||||
|
|
||||||
|
use Symfony\Component\DependencyInjection\Compiler\PriorityTaggedServiceTrait;
|
||||||
|
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||||
|
use Symfony\Component\DependencyInjection\Reference;
|
||||||
|
|
||||||
|
class PriorityTaggedServiceTraitTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
public function testThatCacheWarmersAreProcessedInPriorityOrder()
|
||||||
|
{
|
||||||
|
$services = array(
|
||||||
|
'my_service1' => array('my_custom_tag' => array('priority' => 100)),
|
||||||
|
'my_service2' => array('my_custom_tag' => array('priority' => 200)),
|
||||||
|
'my_service3' => array('my_custom_tag' => array('priority' => -501)),
|
||||||
|
'my_service4' => array('my_custom_tag' => array()),
|
||||||
|
'my_service5' => array('my_custom_tag' => array('priority' => -1)),
|
||||||
|
'my_service6' => array('my_custom_tag' => array('priority' => -500)),
|
||||||
|
'my_service7' => array('my_custom_tag' => array('priority' => -499)),
|
||||||
|
'my_service8' => array('my_custom_tag' => array('priority' => 1)),
|
||||||
|
'my_service9' => array('my_custom_tag' => array('priority' => -2)),
|
||||||
|
'my_service10' => array('my_custom_tag' => array('priority' => -1000)),
|
||||||
|
'my_service11' => array('my_custom_tag' => array('priority' => -1001)),
|
||||||
|
'my_service12' => array('my_custom_tag' => array('priority' => -1002)),
|
||||||
|
'my_service13' => array('my_custom_tag' => array('priority' => -1003)),
|
||||||
|
);
|
||||||
|
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
|
||||||
|
foreach ($services as $id => $tags) {
|
||||||
|
$definition = $container->register($id);
|
||||||
|
|
||||||
|
foreach ($tags as $name => $attributes) {
|
||||||
|
$definition->addTag($name, $attributes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$expected = array(
|
||||||
|
new Reference('my_service2'),
|
||||||
|
new Reference('my_service1'),
|
||||||
|
new Reference('my_service8'),
|
||||||
|
new Reference('my_service4'),
|
||||||
|
new Reference('my_service5'),
|
||||||
|
new Reference('my_service9'),
|
||||||
|
new Reference('my_service7'),
|
||||||
|
new Reference('my_service6'),
|
||||||
|
new Reference('my_service3'),
|
||||||
|
new Reference('my_service10'),
|
||||||
|
new Reference('my_service11'),
|
||||||
|
new Reference('my_service12'),
|
||||||
|
new Reference('my_service13'),
|
||||||
|
);
|
||||||
|
|
||||||
|
$priorityTaggedServiceTraitImplementation = new PriorityTaggedServiceTraitImplementation();
|
||||||
|
|
||||||
|
$this->assertEquals($expected, $priorityTaggedServiceTraitImplementation->test('my_custom_tag', $container));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class PriorityTaggedServiceTraitImplementation
|
||||||
|
{
|
||||||
|
use PriorityTaggedServiceTrait;
|
||||||
|
|
||||||
|
public function test($tagName, ContainerBuilder $container)
|
||||||
|
{
|
||||||
|
return $this->findAndSortTaggedServices($tagName, $container);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user