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/cache": "~3.1",
|
||||
"symfony/class-loader": "~2.8|~3.0",
|
||||
"symfony/dependency-injection": "~3.1",
|
||||
"symfony/dependency-injection": "~3.2",
|
||||
"symfony/config": "~2.8|~3.0",
|
||||
"symfony/event-dispatcher": "~2.8|~3.0",
|
||||
"symfony/http-foundation": "~3.1",
|
||||
|
@ -38,10 +38,10 @@ trait PriorityTaggedServiceTrait
|
||||
foreach ($services as $serviceId => $tags) {
|
||||
foreach ($tags as $attributes) {
|
||||
$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