Skip to content

Commit

Permalink
Merge branch '1.12.x' into 2.0.x
Browse files Browse the repository at this point in the history
* 1.12.x:
  Make manager registry resettable
  Update XSD to allow for complex driver options
  Allow non-scalar DBAL options
  split tests to test well known services one at a time
  fix well known schema filter blacklist tables
  • Loading branch information
alcaeus committed Dec 18, 2019
2 parents e13397b + 6a81d1c commit 651107e
Show file tree
Hide file tree
Showing 26 changed files with 329 additions and 93 deletions.
4 changes: 2 additions & 2 deletions DependencyInjection/Compiler/WellKnownSchemaFilterPass.php
Expand Up @@ -32,11 +32,11 @@ public function process(ContainerBuilder $container)
break;

case PdoSessionHandler::class:
$blacklist[] = $definition->getArguments()[1]['db_table'] ?? 'lock_keys';
$blacklist[] = $definition->getArguments()[1]['db_table'] ?? 'sessions';
break;

case PdoStore::class:
$blacklist[] = $definition->getArguments()[1]['db_table'] ?? 'sessions';
$blacklist[] = $definition->getArguments()[1]['db_table'] ?? 'lock_keys';
break;

case Connection::class:
Expand Down
2 changes: 1 addition & 1 deletion DependencyInjection/Configuration.php
Expand Up @@ -145,7 +145,7 @@ private function getDbalConnectionsNode()
->booleanNode('keep_slave')->end()
->arrayNode('options')
->useAttributeAsKey('key')
->prototype('scalar')->end()
->prototype('variable')->end()
->end()
->arrayNode('mapping_types')
->useAttributeAsKey('name')
Expand Down
10 changes: 9 additions & 1 deletion Registry.php
Expand Up @@ -5,11 +5,12 @@
use Doctrine\ORM\ORMException;
use Psr\Container\ContainerInterface;
use Symfony\Bridge\Doctrine\ManagerRegistry;
use Symfony\Contracts\Service\ResetInterface;

/**
* References all Doctrine connections and entity managers in a given Container.
*/
class Registry extends ManagerRegistry
class Registry extends ManagerRegistry implements ResetInterface
{
/**
* @param string[] $connections
Expand Down Expand Up @@ -46,4 +47,11 @@ public function getAliasNamespace($alias)

throw ORMException::unknownEntityNamespace($alias);
}

public function reset() : void
{
foreach ($this->getManagerNames() as $managerName) {
$this->resetManager($managerName);
}
}
}
1 change: 1 addition & 0 deletions Resources/config/dbal.xml
Expand Up @@ -63,6 +63,7 @@
<argument>%doctrine.entity_managers%</argument>
<argument>%doctrine.default_connection%</argument>
<argument>%doctrine.default_entity_manager%</argument>
<tag name="kernel.reset" method="reset" />
</service>
<service id="Doctrine\Persistence\ManagerRegistry" alias="doctrine" public="false" />
<service id="Doctrine\Common\Persistence\ManagerRegistry" alias="doctrine" public="false" />
Expand Down
6 changes: 3 additions & 3 deletions Resources/config/schema/doctrine-1.0.xsd
Expand Up @@ -94,11 +94,11 @@
</xsd:complexType>

<xsd:complexType name="option">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:complexContent>
<xsd:extension base="xsd:anyType">
<xsd:attribute name="key" type="xsd:string" use="required" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="connection">
Expand Down
48 changes: 31 additions & 17 deletions Tests/DependencyInjection/AbstractDoctrineExtensionTest.php
Expand Up @@ -45,6 +45,8 @@ public function testDbalLoadFromXmlMultipleConnections()
$this->assertSame('sqlite_s3cr3t', $config['password']);
$this->assertSame('/tmp/db.sqlite', $config['path']);
$this->assertTrue($config['memory']);
$this->assertSame(['asin' => ['callback' => 'asin', 'numArgs' => 1]], $config['driverOptions']['userDefinedFunctions']);
$this->assertSame('foo', $config['driverOptions']['arbitraryValue']);

// doctrine.dbal.oci8_connection
$config = $container->getDefinition('doctrine.dbal.oci_connection')->getArgument(0);
Expand Down Expand Up @@ -783,21 +785,32 @@ public function testDbalSchemaFilterNewConfig()
$this->assertNull($connConfig = $getConfiguration('connection3')->getSchemaAssetsFilter());
}

public function testWellKnownSchemaFilterDefaultTables()
public static function dataWellKnownSchemaFilterServices()
{
yield ['cache', 'cache_items'];
yield ['lock', 'lock_keys'];
yield ['messenger', 'messenger_messages'];
yield ['session', 'sessions'];
}

/**
* @dataProvider dataWellKnownSchemaFilterServices
*/
public function testWellKnownSchemaFilterDefaultTables(string $fileName, string $tableName)
{
$container = $this->getContainer([]);
$loader = new DoctrineExtension();
$container->registerExtension($loader);
$container->addCompilerPass(new WellKnownSchemaFilterPass());
$container->addCompilerPass(new DbalSchemaFilterPass());

$this->loadFromFile($container, 'well_known_schema_filter_default_tables');
$this->loadFromFile($container, 'well_known_schema_filter_default_tables_' . $fileName);

$this->compileContainer($container);

$definition = $container->getDefinition('doctrine.dbal.well_known_schema_asset_filter');

$this->assertSame([['cache_items', 'lock_keys', 'sessions', 'messenger_messages']], $definition->getArguments());
$this->assertSame([[$tableName]], $definition->getArguments());
$this->assertSame([['connection' => 'connection1'], ['connection' => 'connection2'], ['connection' => 'connection3']], $definition->getTag('doctrine.dbal.schema_filter'));

$definition = $container->getDefinition('doctrine.dbal.connection1_schema_asset_filter_manager');
Expand All @@ -806,35 +819,36 @@ public function testWellKnownSchemaFilterDefaultTables()

$filter = $container->get('well_known_filter');

$this->assertFalse($filter('sessions'));
$this->assertFalse($filter('cache_items'));
$this->assertFalse($filter('lock_keys'));
$this->assertFalse($filter('messenger_messages'));
$this->assertFalse($filter($tableName));
$this->assertTrue($filter('anything_else'));
}

public function testWellKnownSchemaFilterOverriddenTables()
public static function dataWellKnownSchemaOverriddenTablesFilterServices()
{
yield ['cache', 'app_cache'];
yield ['lock', 'app_locks'];
yield ['messenger', 'app_messages'];
yield ['session', 'app_session'];
}

/**
* @dataProvider dataWellKnownSchemaOverriddenTablesFilterServices
*/
public function testWellKnownSchemaFilterOverriddenTables(string $fileName, string $tableName)
{
$container = $this->getContainer([]);
$loader = new DoctrineExtension();
$container->registerExtension($loader);
$container->addCompilerPass(new WellKnownSchemaFilterPass());
$container->addCompilerPass(new DbalSchemaFilterPass());

$this->loadFromFile($container, 'well_known_schema_filter_overridden_tables');
$this->loadFromFile($container, 'well_known_schema_filter_overridden_tables_' . $fileName);

$this->compileContainer($container);

$filter = $container->get('well_known_filter');

$this->assertFalse($filter('app_session'));
$this->assertFalse($filter('app_cache'));
$this->assertFalse($filter('app_locks'));
$this->assertFalse($filter('app_messages'));
$this->assertTrue($filter('sessions'));
$this->assertTrue($filter('cache_items'));
$this->assertTrue($filter('lock_keys'));
$this->assertTrue($filter('messenger_messages'));
$this->assertFalse($filter($tableName));
}

public function testEntityListenerResolver()
Expand Down
Expand Up @@ -21,7 +21,15 @@
user="sqlite_user"
password="sqlite_s3cr3t"
path="/tmp/db.sqlite"
memory="true" />
memory="true">
<option key="userDefinedFunctions">
<asin>
<callback>asin</callback>
<numArgs>1</numArgs>
</asin>
</option>
<option key="arbitraryValue">foo</option>
</connection>
<connection
name="oci"
driver="oci8"
Expand Down
@@ -0,0 +1,21 @@
<?xml version="1.0" ?>

<srv:container xmlns="http://symfony.com/schema/dic/doctrine"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:srv="http://symfony.com/schema/dic/services"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
http://symfony.com/schema/dic/doctrine http://symfony.com/schema/dic/doctrine/doctrine-1.0.xsd">

<config>
<dbal default-connection="connection1">
<connection name="connection1" schema-filter="~^(?!t_)~" />
<connection name="connection2" />
<connection name="connection3" />
</dbal>
</config>

<srv:services>
<srv:service id="well_known_filter" alias="doctrine.dbal.well_known_schema_asset_filter" public="true" />
<srv:service id="symfony.cache" class="Symfony\Component\Cache\Adapter\PdoAdapter" />
</srv:services>
</srv:container>
@@ -0,0 +1,21 @@
<?xml version="1.0" ?>

<srv:container xmlns="http://symfony.com/schema/dic/doctrine"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:srv="http://symfony.com/schema/dic/services"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
http://symfony.com/schema/dic/doctrine http://symfony.com/schema/dic/doctrine/doctrine-1.0.xsd">

<config>
<dbal default-connection="connection1">
<connection name="connection1" schema-filter="~^(?!t_)~" />
<connection name="connection2" />
<connection name="connection3" />
</dbal>
</config>

<srv:services>
<srv:service id="well_known_filter" alias="doctrine.dbal.well_known_schema_asset_filter" public="true" />
<srv:service id="symfony.lock" class="Symfony\Component\Lock\Store\PdoStore" />
</srv:services>
</srv:container>
@@ -0,0 +1,21 @@
<?xml version="1.0" ?>

<srv:container xmlns="http://symfony.com/schema/dic/doctrine"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:srv="http://symfony.com/schema/dic/services"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
http://symfony.com/schema/dic/doctrine http://symfony.com/schema/dic/doctrine/doctrine-1.0.xsd">

<config>
<dbal default-connection="connection1">
<connection name="connection1" schema-filter="~^(?!t_)~" />
<connection name="connection2" />
<connection name="connection3" />
</dbal>
</config>

<srv:services>
<srv:service id="well_known_filter" alias="doctrine.dbal.well_known_schema_asset_filter" public="true" />
<srv:service id="symfony.messenger" class="Symfony\Component\Messenger\Transport\Doctrine\Connection" />
</srv:services>
</srv:container>
Expand Up @@ -16,9 +16,6 @@

<srv:services>
<srv:service id="well_known_filter" alias="doctrine.dbal.well_known_schema_asset_filter" public="true" />
<srv:service id="symfony.cache" class="Symfony\Component\Cache\Adapter\PdoAdapter" />
<srv:service id="symfony.session" class="Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler" />
<srv:service id="symfony.lock" class="Symfony\Component\Lock\Store\PdoStore" />
<srv:service id="symfony.messenger" class="Symfony\Component\Messenger\Transport\Doctrine\Connection" />
</srv:services>
</srv:container>
Expand Up @@ -24,22 +24,5 @@
<srv:argument key="db_table">app_cache</srv:argument>
</srv:argument>
</srv:service>
<srv:service id="symfony.session" class="Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler">
<srv:argument />
<srv:argument type="collection">
<srv:argument key="db_table">app_session</srv:argument>
</srv:argument>
</srv:service>
<srv:service id="symfony.lock" class="Symfony\Component\Lock\Store\PdoStore">
<srv:argument />
<srv:argument type="collection">
<srv:argument key="db_table">app_locks</srv:argument>
</srv:argument>
</srv:service>
<srv:service id="symfony.messenger" class="Symfony\Component\Messenger\Transport\Doctrine\Connection">
<srv:argument type="collection">
<srv:argument key="table_name">app_messages</srv:argument>
</srv:argument>
</srv:service>
</srv:services>
</srv:container>
@@ -0,0 +1,26 @@
<?xml version="1.0" ?>

<srv:container xmlns="http://symfony.com/schema/dic/doctrine"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:srv="http://symfony.com/schema/dic/services"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
http://symfony.com/schema/dic/doctrine http://symfony.com/schema/dic/doctrine/doctrine-1.0.xsd">

<config>
<dbal default-connection="connection1">
<connection name="connection1" schema-filter="~^(?!t_)~" />
<connection name="connection2" />
<connection name="connection3" />
</dbal>
</config>

<srv:services>
<srv:service id="well_known_filter" alias="doctrine.dbal.well_known_schema_asset_filter" public="true" />
<srv:service id="symfony.lock" class="Symfony\Component\Lock\Store\PdoStore">
<srv:argument />
<srv:argument type="collection">
<srv:argument key="db_table">app_locks</srv:argument>
</srv:argument>
</srv:service>
</srv:services>
</srv:container>
@@ -0,0 +1,25 @@
<?xml version="1.0" ?>

<srv:container xmlns="http://symfony.com/schema/dic/doctrine"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:srv="http://symfony.com/schema/dic/services"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
http://symfony.com/schema/dic/doctrine http://symfony.com/schema/dic/doctrine/doctrine-1.0.xsd">

<config>
<dbal default-connection="connection1">
<connection name="connection1" schema-filter="~^(?!t_)~" />
<connection name="connection2" />
<connection name="connection3" />
</dbal>
</config>

<srv:services>
<srv:service id="well_known_filter" alias="doctrine.dbal.well_known_schema_asset_filter" public="true" />
<srv:service id="symfony.messenger" class="Symfony\Component\Messenger\Transport\Doctrine\Connection">
<srv:argument type="collection">
<srv:argument key="table_name">app_messages</srv:argument>
</srv:argument>
</srv:service>
</srv:services>
</srv:container>
@@ -0,0 +1,26 @@
<?xml version="1.0" ?>

<srv:container xmlns="http://symfony.com/schema/dic/doctrine"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:srv="http://symfony.com/schema/dic/services"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
http://symfony.com/schema/dic/doctrine http://symfony.com/schema/dic/doctrine/doctrine-1.0.xsd">

<config>
<dbal default-connection="connection1">
<connection name="connection1" schema-filter="~^(?!t_)~" />
<connection name="connection2" />
<connection name="connection3" />
</dbal>
</config>

<srv:services>
<srv:service id="well_known_filter" alias="doctrine.dbal.well_known_schema_asset_filter" public="true" />
<srv:service id="symfony.session" class="Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler">
<srv:argument />
<srv:argument type="collection">
<srv:argument key="db_table">app_session</srv:argument>
</srv:argument>
</srv:service>
</srv:services>
</srv:container>
Expand Up @@ -14,6 +14,12 @@ doctrine:
password: sqlite_s3cr3t
path: /tmp/db.sqlite
memory: true
options:
userDefinedFunctions:
asin:
callback: 'asin'
numArgs: 1
arbitraryValue: foo
oci:
driver: oci8
dbname: oracle_db
Expand Down
@@ -0,0 +1,16 @@
doctrine:
dbal:
default_connection: connection1
connections:
connection1:
schema_filter: ~^(?!t_)~
connection2: []
connection3: []

services:
well_known_filter:
alias: 'doctrine.dbal.well_known_schema_asset_filter'
public: true

symfony.cache:
class: 'Symfony\Component\Cache\Adapter\PdoAdapter'

0 comments on commit 651107e

Please sign in to comment.