Skip to content

Commit

Permalink
Merge pull request #159 from JJK801/filters
Browse files Browse the repository at this point in the history
Enabling filter's default parameters in config files
  • Loading branch information
stof committed Mar 5, 2013
2 parents 6c6e2cf + 35b3043 commit d355798
Show file tree
Hide file tree
Showing 8 changed files with 90 additions and 10 deletions.
9 changes: 8 additions & 1 deletion DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -367,17 +367,24 @@ private function getOrmEntityManagersNode()
->end()
->beforeNormalization()
// The content of the XML node is returned as the "value" key so we need to rename it
->ifTrue(function($v) {return is_array($v) && isset($v['value']); })
->ifTrue(function($v) {
return is_array($v) && isset($v['value']);
})
->then(function($v) {
$v['class'] = $v['value'];
unset($v['value']);

return $v;
})
->end()
->fixXmlConfig('parameter')
->children()
->scalarNode('class')->isRequired()->end()
->booleanNode('enabled')->defaultFalse()->end()
->arrayNode('parameters')
->useAttributeAsKey('name')
->prototype('variable')->end()
->end()
->end()
->end()
->end()
Expand Down
5 changes: 5 additions & 0 deletions DependencyInjection/DoctrineExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -321,17 +321,22 @@ protected function loadOrmEntityManager(array $entityManager, ContainerBuilder $
}

$enabledFilters = array();
$filtersParameters = array();
foreach ($entityManager['filters'] as $name => $filter) {
$ormConfigDef->addMethodCall('addFilter', array($name, $filter['class']));
if ($filter['enabled']) {
$enabledFilters[] = $name;
}
if ($filter['parameters']) {
$filtersParameters[$name] = $filter['parameters'];
}
}

$managerConfiguratorName = sprintf('doctrine.orm.%s_manager_configurator', $entityManager['name']);
$managerConfiguratorDef = $container
->setDefinition($managerConfiguratorName, new DefinitionDecorator('doctrine.orm.manager_configurator.abstract'))
->replaceArgument(0, $enabledFilters)
->replaceArgument(1, $filtersParameters)
;

if (!isset($entityManager['connection'])) {
Expand Down
28 changes: 26 additions & 2 deletions ManagerConfigurator.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
namespace Doctrine\Bundle\DoctrineBundle;

use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Query\Filter\SQLFilter;

/**
* Configurator for an EntityManager
Expand All @@ -24,15 +25,17 @@
class ManagerConfigurator
{
private $enabledFilters = array();
private $filtersParameters = array();

/**
* Construct.
*
* @param array $enabledFilters
*/
public function __construct(array $enabledFilters)
public function __construct(array $enabledFilters, array $filtersParameters)
{
$this->enabledFilters = $enabledFilters;
$this->filtersParameters = $filtersParameters;
}

/**
Expand Down Expand Up @@ -60,7 +63,28 @@ private function enableFilters(EntityManager $entityManager)

$filterCollection = $entityManager->getFilters();
foreach ($this->enabledFilters as $filter) {
$filterCollection->enable($filter);
$filterObject = $filterCollection->enable($filter);
if (null !== $filterObject) {
$this->setFilterParameters($filter, $filterObject);
}
}
}

/**
* Set defaults parameters for a given filter
*
* @param string $name Filter name
* @param SQLFilter $filter Filter object
*
* @return null
*/
private function setFilterParameters($name, SQLFilter $filter)
{
if (!empty($this->filtersParameters[$name])) {
$parameters = $this->filtersParameters[$name];
foreach ($parameters as $paramName => $paramValue) {
$filter->setParameter($paramName, $paramValue);
}
}
}
}
1 change: 1 addition & 0 deletions Resources/config/orm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@
<!-- The configurator cannot be a private service -->
<service id="doctrine.orm.manager_configurator.abstract" class="%doctrine.orm.manager_configurator.class%" abstract="true">
<argument type="collection" />
<argument type="collection" />
</service>

<!-- validator -->
Expand Down
12 changes: 10 additions & 2 deletions Resources/config/schema/doctrine-1.0.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -171,11 +171,19 @@
<xsd:attribute name="naming-strategy" type="xsd:string" />
</xsd:complexType>

<xsd:complexType name="filter">
<xsd:complexType name="filter" mixed="true">
<xsd:choice minOccurs="0">
<xsd:element name="parameter" type="parameter" minOccurs="0" maxOccurs="unbounded" />
</xsd:choice>
<xsd:attribute name="name" type="xsd:string" use="required" />
<xsd:attribute name="class" type="xsd:string" />
<xsd:attribute name="enabled" type="xsd:boolean" />
</xsd:complexType>

<xsd:complexType name="parameter">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="name" type="xsd:string" use="required" />
<xsd:attribute name="enabled" type="xsd:boolean" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
Expand Down
31 changes: 28 additions & 3 deletions Tests/DependencyInjection/AbstractDoctrineExtensionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -762,15 +762,19 @@ public function testAddFilter()
$this->compileContainer($container);

$definition = $container->getDefinition('doctrine.orm.default_configuration');
$this->assertDICDefinitionMethodCallOnce($definition, 'addFilter', array('soft_delete', 'Doctrine\Bundle\DoctrineBundle\Tests\DependencyInjection\TestFilter'));
$args = array(
array('soft_delete', 'Doctrine\Bundle\DoctrineBundle\Tests\DependencyInjection\TestFilter'),
array('myFilter', 'Doctrine\Bundle\DoctrineBundle\Tests\DependencyInjection\TestFilter')
);
$this->assertDICDefinitionMethodCallCount($definition, 'addFilter', $args, 2);

$definition = $container->getDefinition('doctrine.orm.default_manager_configurator');
$this->assertDICConstructorArguments($definition, array(array('soft_delete')));
$this->assertDICConstructorArguments($definition, array(array('soft_delete', 'myFilter'), array('myFilter' => array('myParameter' => 'myValue', 'mySecondParameter' => 'mySecondValue'))));

// Let's create the instance to check the configurator work.
/** @var $entityManager \Doctrine\ORM\EntityManager */
$entityManager = $container->get('doctrine.orm.entity_manager');
$this->assertCount(1, $entityManager->getFilters()->getEnabledFilters());
$this->assertCount(2, $entityManager->getFilters()->getEnabledFilters());
}

public function testResolveTargetEntity()
Expand Down Expand Up @@ -878,6 +882,27 @@ protected function assertDICDefinitionMethodCallOnce($definition, $methodName, a
}
}

protected function assertDICDefinitionMethodCallCount($definition, $methodName, array $params = array(), $nbCalls=1)
{
$calls = $definition->getMethodCalls();
$called = 0;
foreach ($calls as $call) {
if ($call[0] == $methodName) {
if ($called > $nbCalls) {
break;
}

if (isset($params[$called])) {
$this->assertEquals($params[$called], $call[1], "Expected parameters to methods '".$methodName."' do not match the actual parameters.");
}
$called++;
}
}

$this->assertEquals($nbCalls, $called, sprintf('The method "%s" should be called %d times', $methodName, $nbCalls));
}


protected function compileContainer(ContainerBuilder $container)
{
$container->getCompilerPassConfig()->setOptimizationPasses(array(new ResolveDefinitionTemplatesPass()));
Expand Down
8 changes: 6 additions & 2 deletions Tests/DependencyInjection/Fixtures/config/xml/orm_filters.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,11 @@
</dbal>

<orm>
<filter name="soft_delete" enabled="true">Doctrine\Bundle\DoctrineBundle\Tests\DependencyInjection\TestFilter</filter>
<filter name="soft_delete" enabled="true" >Doctrine\Bundle\DoctrineBundle\Tests\DependencyInjection\TestFilter</filter>
<filter name="myFilter" enabled="true" class="Doctrine\Bundle\DoctrineBundle\Tests\DependencyInjection\TestFilter">
<parameter name="myParameter">myValue</parameter>
<parameter name="mySecondParameter">mySecondValue</parameter>
</filter>
</orm>
</config>
</srv:container>
</srv:container>
6 changes: 6 additions & 0 deletions Tests/DependencyInjection/Fixtures/config/yml/orm_filters.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,9 @@ doctrine:
soft_delete:
class: Doctrine\Bundle\DoctrineBundle\Tests\DependencyInjection\TestFilter
enabled: true
myFilter:
class: Doctrine\Bundle\DoctrineBundle\Tests\DependencyInjection\TestFilter
enabled: true
parameters:
myParameter: myValue
mySecondParameter: mySecondValue

0 comments on commit d355798

Please sign in to comment.