Skip to content

Commit 2fb70c3

Browse files
committed
add legacy symfony support
1 parent e8b39a2 commit 2fb70c3

File tree

2 files changed

+105
-8
lines changed

2 files changed

+105
-8
lines changed
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<?php
2+
3+
namespace FOS\UserBundle\DependencyInjection\Compiler;
4+
5+
use Symfony\Component\DependencyInjection\ContainerBuilder;
6+
use Symfony\Component\DependencyInjection\Definition;
7+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
8+
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
9+
10+
/**
11+
* Forward compatibility class in case FOSUserBundle is used with older
12+
* versions of Symfony2 or the doctrine bundles that do not provide the
13+
* register mappings compiler pass yet.
14+
*
15+
* @deprecated Compatibility class to make the bundle work with Symfony < 2.3.
16+
* To be removed when this bundle drops support for Symfony < 2.3
17+
*
18+
* @author David Buchmann <[email protected]>
19+
*/
20+
class RegisterMappingsPass implements CompilerPassInterface
21+
{
22+
private $driver;
23+
private $driverPattern;
24+
private $namespaces;
25+
private $enabledParameter;
26+
private $fallbackManagerParameter;
27+
28+
public function __construct($driver, $driverPattern, $namespaces, $enabledParameter, $fallbackManagerParameter)
29+
{
30+
$this->driver = $driver;
31+
$this->driverPattern = $driverPattern;
32+
$this->namespaces = $namespaces;
33+
$this->enabledParameter = $enabledParameter;
34+
$this->fallbackManagerParameter = $fallbackManagerParameter;
35+
}
36+
37+
/**
38+
* Register mappings with the metadata drivers.
39+
*
40+
* @param ContainerBuilder $container
41+
*/
42+
public function process(ContainerBuilder $container)
43+
{
44+
if (!$container->hasParameter($this->enabledParameter)) {
45+
return;
46+
}
47+
48+
$chainDriverDefService = $this->getChainDriverServiceName($container);
49+
$chainDriverDef = $container->getDefinition($chainDriverDefService);
50+
foreach ($this->namespaces as $namespace) {
51+
$chainDriverDef->addMethodCall('addDriver', array($this->driver, $namespace));
52+
}
53+
}
54+
55+
protected function getChainDriverServiceName(ContainerBuilder $container)
56+
{
57+
foreach (array('fos_user.model_manager_name', $this->fallbackManagerParameter) as $param) {
58+
if ($container->hasParameter($param)) {
59+
$name = $container->getParameter($param);
60+
if ($name) {
61+
return sprintf($this->driverPattern, $name);
62+
}
63+
}
64+
}
65+
66+
throw new ParameterNotFoundException('None of the managerParameters resulted in a valid name');
67+
}
68+
69+
public static function createOrmMappingDriver(array $mappings)
70+
{
71+
$arguments = array($mappings, '.orm.xml');
72+
$locator = new Definition('Doctrine\Common\Persistence\Mapping\Driver\SymfonyFileLocator', $arguments);
73+
$driver = new Definition('Doctrine\ORM\Mapping\Driver\XmlDriver', array($locator));
74+
75+
return new RegisterMappingsPass($driver, 'doctrine.orm.%s_metadata_driver', $mappings, 'fos_user.backend_type_orm', 'doctrine.default_entity_manager');
76+
}
77+
78+
public static function createMongoDBMappingDriver($mappings)
79+
{
80+
$arguments = array($mappings, '.mongodb.xml');
81+
$locator = new Definition('Doctrine\Common\Persistence\Mapping\Driver\SymfonyFileLocator', $arguments);
82+
$driver = new Definition('Doctrine\ODM\MongoDB\Mapping\Driver\XmlDriver', array($locator));
83+
84+
return new RegisterMappingsPass($driver, 'doctrine_mongodb.odm.%s_metadata_driver', $mappings, 'fos_user.backend_type_mongodb', 'doctrine_mongodb.odm.default_document_manager');
85+
}
86+
}

FOSUserBundle.php

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace FOS\UserBundle;
1313

14+
use FOS\UserBundle\DependencyInjection\Compiler\RegisterMappingsPass;
1415
use Symfony\Component\HttpKernel\Bundle\Bundle;
1516
use Symfony\Component\DependencyInjection\ContainerBuilder;
1617
use FOS\UserBundle\DependencyInjection\Compiler\ValidationPass;
@@ -23,27 +24,37 @@
2324
*/
2425
class FOSUserBundle extends Bundle
2526
{
27+
2628
public function build(ContainerBuilder $container)
2729
{
2830
parent::build($container);
2931
$container->addCompilerPass(new ValidationPass());
3032

31-
if (! class_exists('Symfony\Bridge\Doctrine\DependencyInjection\CompilerPass\RegisterMappingsPass')) {
32-
// TODO: provide a temporary implementation of the compiler pass in FOSUserBundle
33-
// so people can already use the Model class even with older symfony?
34-
return;
35-
}
33+
$this->addRegisterMappingsPass($container);
34+
}
35+
36+
/**
37+
* @param ContainerBuilder $container
38+
*/
39+
private function addRegisterMappingsPass(ContainerBuilder $container)
40+
{
41+
// the base class is only available since symfony 2.3
42+
$symfonyVersion = class_exists('Symfony\Bridge\Doctrine\DependencyInjection\CompilerPass\RegisterMappingsPass');
3643

3744
$mappings = array(
38-
realpath(__DIR__.'/Resources/config/doctrine/model') => 'FOS\UserBundle\Model',
45+
realpath(__DIR__ . '/Resources/config/doctrine/model') => 'FOS\UserBundle\Model',
3946
);
4047

41-
if (class_exists('Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\DoctrineOrmMappingsPass')) {
48+
if ($symfonyVersion && class_exists('Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\DoctrineOrmMappingsPass')) {
4249
$container->addCompilerPass(DoctrineOrmMappingsPass::createXmlMappingDriver($mappings, array('fos_user.model_manager_name'), 'fos_user.backend_type_orm'));
50+
} else {
51+
$container->addCompilerPass(RegisterMappingsPass::createOrmMappingDriver($mappings));
4352
}
4453

45-
if (class_exists('Doctrine\Bundle\MongoDBBundle\DependencyInjection\Compiler\DoctrineMongoDBMappingsPass')) {
54+
if ($symfonyVersion && class_exists('Doctrine\Bundle\MongoDBBundle\DependencyInjection\Compiler\DoctrineMongoDBMappingsPass')) {
4655
$container->addCompilerPass(DoctrineMongoDBMappingsPass::createXmlMappingDriver($mappings, array('fos_user.model_manager_name'), 'fos_user.backend_type_mongodb'));
56+
} else {
57+
$container->addCompilerPass(RegisterMappingsPass::createMongoDBMappingDriver($mappings));
4758
}
4859

4960
// TODO: couch

0 commit comments

Comments
 (0)