Skip to content

Client Extensions #72

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
May 5, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

namespace Enqueue\Bundle\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;

class BuildClientExtensionsPass implements CompilerPassInterface
{
/**
* {@inheritdoc}
*/
public function process(ContainerBuilder $container)
{
if (false == $container->hasDefinition('enqueue.client.extensions')) {
return;
}

$tags = $container->findTaggedServiceIds('enqueue.client.extension');

$groupByPriority = [];
foreach ($tags as $serviceId => $tagAttributes) {
foreach ($tagAttributes as $tagAttribute) {
$priority = isset($tagAttribute['priority']) ? (int) $tagAttribute['priority'] : 0;

$groupByPriority[$priority][] = new Reference($serviceId);
}
}

krsort($groupByPriority, SORT_NUMERIC);

$flatExtensions = [];
foreach ($groupByPriority as $extension) {
$flatExtensions = array_merge($flatExtensions, $extension);
}

$container->getDefinition('enqueue.client.extensions')->replaceArgument(0, $flatExtensions);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;

class BuildExtensionsPass implements CompilerPassInterface
class BuildConsumptionExtensionsPass implements CompilerPassInterface
{
/**
* {@inheritdoc}
Expand Down
6 changes: 4 additions & 2 deletions pkg/enqueue-bundle/EnqueueBundle.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
use Enqueue\AmqpExt\AmqpContext;
use Enqueue\AmqpExt\Symfony\AmqpTransportFactory;
use Enqueue\AmqpExt\Symfony\RabbitMqAmqpTransportFactory;
use Enqueue\Bundle\DependencyInjection\Compiler\BuildClientExtensionsPass;
use Enqueue\Bundle\DependencyInjection\Compiler\BuildClientRoutingPass;
use Enqueue\Bundle\DependencyInjection\Compiler\BuildExtensionsPass;
use Enqueue\Bundle\DependencyInjection\Compiler\BuildConsumptionExtensionsPass;
use Enqueue\Bundle\DependencyInjection\Compiler\BuildProcessorRegistryPass;
use Enqueue\Bundle\DependencyInjection\Compiler\BuildQueueMetaRegistryPass;
use Enqueue\Bundle\DependencyInjection\Compiler\BuildTopicMetaSubscribersPass;
Expand Down Expand Up @@ -34,11 +35,12 @@ class EnqueueBundle extends Bundle
*/
public function build(ContainerBuilder $container)
{
$container->addCompilerPass(new BuildExtensionsPass());
$container->addCompilerPass(new BuildConsumptionExtensionsPass());
$container->addCompilerPass(new BuildClientRoutingPass());
$container->addCompilerPass(new BuildProcessorRegistryPass());
$container->addCompilerPass(new BuildTopicMetaSubscribersPass());
$container->addCompilerPass(new BuildQueueMetaRegistryPass());
$container->addCompilerPass(new BuildClientExtensionsPass());

/** @var EnqueueExtension $extension */
$extension = $container->getExtension('enqueue');
Expand Down
10 changes: 9 additions & 1 deletion pkg/enqueue-bundle/Resources/config/client.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,15 @@ services:

enqueue.client.producer:
class: 'Enqueue\Client\Producer'
arguments: ['@enqueue.client.driver']
arguments:
- '@enqueue.client.driver'
- '@enqueue.client.extensions'

enqueue.client.extensions:
class: 'Enqueue\Client\ChainExtension'
public: false
arguments:
- []

enqueue.producer:
alias: 'enqueue.client.producer'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
<?php

namespace Enqueue\Bundle\Tests\Unit\DependencyInjection\Compiler;

use Enqueue\Bundle\DependencyInjection\Compiler\BuildClientExtensionsPass;
use Enqueue\Test\ClassExtensionTrait;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;
use PHPUnit\Framework\TestCase;

class BuildClientExtensionsPassTest extends TestCase
{
use ClassExtensionTrait;

public function testShouldImplementCompilerPass()
{
$this->assertClassImplements(CompilerPassInterface::class, BuildClientExtensionsPass::class);
}

public function testCouldBeConstructedWithoutAnyArguments()
{
new BuildClientExtensionsPass();
}

public function testShouldReplaceFirstArgumentOfExtensionsServiceConstructorWithTaggsExtensions()
{
$container = new ContainerBuilder();

$extensions = new Definition();
$extensions->addArgument([]);
$container->setDefinition('enqueue.client.extensions', $extensions);

$extension = new Definition();
$extension->addTag('enqueue.client.extension');
$container->setDefinition('foo_extension', $extension);

$extension = new Definition();
$extension->addTag('enqueue.client.extension');
$container->setDefinition('bar_extension', $extension);

$pass = new BuildClientExtensionsPass();
$pass->process($container);

$this->assertEquals(
[new Reference('foo_extension'), new Reference('bar_extension')],
$extensions->getArgument(0)
);
}

public function testShouldOrderExtensionsByPriority()
{
$container = new ContainerBuilder();

$extensions = new Definition();
$extensions->addArgument([]);
$container->setDefinition('enqueue.client.extensions', $extensions);

$extension = new Definition();
$extension->addTag('enqueue.client.extension', ['priority' => 6]);
$container->setDefinition('foo_extension', $extension);

$extension = new Definition();
$extension->addTag('enqueue.client.extension', ['priority' => -5]);
$container->setDefinition('bar_extension', $extension);

$extension = new Definition();
$extension->addTag('enqueue.client.extension', ['priority' => 2]);
$container->setDefinition('baz_extension', $extension);

$pass = new BuildClientExtensionsPass();
$pass->process($container);

$orderedExtensions = $extensions->getArgument(0);

$this->assertEquals(new Reference('foo_extension'), $orderedExtensions[0]);
$this->assertEquals(new Reference('baz_extension'), $orderedExtensions[1]);
$this->assertEquals(new Reference('bar_extension'), $orderedExtensions[2]);
}

public function testShouldAssumePriorityZeroIfPriorityIsNotSet()
{
$container = new ContainerBuilder();

$extensions = new Definition();
$extensions->addArgument([]);
$container->setDefinition('enqueue.client.extensions', $extensions);

$extension = new Definition();
$extension->addTag('enqueue.client.extension');
$container->setDefinition('foo_extension', $extension);

$extension = new Definition();
$extension->addTag('enqueue.client.extension', ['priority' => 1]);
$container->setDefinition('bar_extension', $extension);

$extension = new Definition();
$extension->addTag('enqueue.client.extension', ['priority' => -1]);
$container->setDefinition('baz_extension', $extension);

$pass = new BuildClientExtensionsPass();
$pass->process($container);

$orderedExtensions = $extensions->getArgument(0);

$this->assertEquals(new Reference('bar_extension'), $orderedExtensions[0]);
$this->assertEquals(new Reference('foo_extension'), $orderedExtensions[1]);
$this->assertEquals(new Reference('baz_extension'), $orderedExtensions[2]);
}

public function testShouldDoesNothingIfClientExtensionServiceIsNotDefined()
{
$container = $this->createMock(ContainerBuilder::class);
$container
->expects($this->once())
->method('hasDefinition')
->with('enqueue.client.extensions')
->willReturn(false)
;
$container
->expects($this->never())
->method('findTaggedServiceIds')
;

$pass = new BuildClientExtensionsPass();
$pass->process($container);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,26 @@

namespace Enqueue\Bundle\Tests\Unit\DependencyInjection\Compiler;

use Enqueue\Bundle\DependencyInjection\Compiler\BuildExtensionsPass;
use Enqueue\Bundle\DependencyInjection\Compiler\BuildConsumptionExtensionsPass;
use Enqueue\Test\ClassExtensionTrait;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;
use PHPUnit\Framework\TestCase;

class BuildExtensionsPassTest extends TestCase
class BuildConsumptionExtensionsPassTest extends TestCase
{
use ClassExtensionTrait;

public function testShouldImplementCompilerPass()
{
$this->assertClassImplements(CompilerPassInterface::class, BuildExtensionsPass::class);
$this->assertClassImplements(CompilerPassInterface::class, BuildConsumptionExtensionsPass::class);
}

public function testCouldBeConstructedWithoutAnyArguments()
{
new BuildExtensionsPass();
new BuildConsumptionExtensionsPass();
}

public function testShouldReplaceFirstArgumentOfExtensionsServiceConstructorWithTaggsExtensions()
Expand All @@ -40,7 +40,7 @@ public function testShouldReplaceFirstArgumentOfExtensionsServiceConstructorWith
$extension->addTag('enqueue.consumption.extension');
$container->setDefinition('bar_extension', $extension);

$pass = new BuildExtensionsPass();
$pass = new BuildConsumptionExtensionsPass();
$pass->process($container);

$this->assertEquals(
Expand Down Expand Up @@ -69,7 +69,7 @@ public function testShouldOrderExtensionsByPriority()
$extension->addTag('enqueue.consumption.extension', ['priority' => 2]);
$container->setDefinition('baz_extension', $extension);

$pass = new BuildExtensionsPass();
$pass = new BuildConsumptionExtensionsPass();
$pass->process($container);

$orderedExtensions = $extensions->getArgument(0);
Expand Down Expand Up @@ -99,7 +99,7 @@ public function testShouldAssumePriorityZeroIfPriorityIsNotSet()
$extension->addTag('enqueue.consumption.extension', ['priority' => -1]);
$container->setDefinition('baz_extension', $extension);

$pass = new BuildExtensionsPass();
$pass = new BuildConsumptionExtensionsPass();
$pass->process($container);

$orderedExtensions = $extensions->getArgument(0);
Expand Down
10 changes: 8 additions & 2 deletions pkg/enqueue-bundle/Tests/Unit/EnqueueBundleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@

use Enqueue\AmqpExt\Symfony\AmqpTransportFactory;
use Enqueue\AmqpExt\Symfony\RabbitMqAmqpTransportFactory;
use Enqueue\Bundle\DependencyInjection\Compiler\BuildClientExtensionsPass;
use Enqueue\Bundle\DependencyInjection\Compiler\BuildClientRoutingPass;
use Enqueue\Bundle\DependencyInjection\Compiler\BuildExtensionsPass;
use Enqueue\Bundle\DependencyInjection\Compiler\BuildConsumptionExtensionsPass;
use Enqueue\Bundle\DependencyInjection\Compiler\BuildProcessorRegistryPass;
use Enqueue\Bundle\DependencyInjection\Compiler\BuildQueueMetaRegistryPass;
use Enqueue\Bundle\DependencyInjection\Compiler\BuildTopicMetaSubscribersPass;
Expand Down Expand Up @@ -46,7 +47,7 @@ public function testShouldRegisterExpectedCompilerPasses()
$container
->expects($this->at(0))
->method('addCompilerPass')
->with($this->isInstanceOf(BuildExtensionsPass::class))
->with($this->isInstanceOf(BuildConsumptionExtensionsPass::class))
;
$container
->expects($this->at(1))
Expand All @@ -70,6 +71,11 @@ public function testShouldRegisterExpectedCompilerPasses()
;
$container
->expects($this->at(5))
->method('addCompilerPass')
->with($this->isInstanceOf(BuildClientExtensionsPass::class))
;
$container
->expects($this->at(6))
->method('getExtension')
->willReturn($extensionMock)
;
Expand Down
39 changes: 39 additions & 0 deletions pkg/enqueue/Client/ChainExtension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

namespace Enqueue\Client;

class ChainExtension implements ExtensionInterface
{
/**
* @var ExtensionInterface[]
*/
private $extensions;

/**
* @param ExtensionInterface[] $extensions
*/
public function __construct(array $extensions)
{
$this->extensions = $extensions;
}

/**
* {@inheritdoc}
*/
public function onPreSend($topic, Message $message)
{
foreach ($this->extensions as $extension) {
$extension->onPreSend($topic, $message);
}
}

/**
* {@inheritdoc}
*/
public function onPostSend($topic, Message $message)
{
foreach ($this->extensions as $extension) {
$extension->onPostSend($topic, $message);
}
}
}
19 changes: 19 additions & 0 deletions pkg/enqueue/Client/ExtensionInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php
namespace Enqueue\Client;

interface ExtensionInterface
{
/**
* @param string $topic
* @param Message $message
* @return
*/
public function onPreSend($topic, Message $message);

/**
* @param string $topic
* @param Message $message
* @return
*/
public function onPostSend($topic, Message $message);
}
Loading