vendor/bundles/FOS/UserBundle/DependencyInjection/FOSUserExtension.php
changeset 3 e54dfe4d0b2b
equal deleted inserted replaced
2:806e57d67020 3:e54dfe4d0b2b
       
     1 <?php
       
     2 
       
     3 /*
       
     4  * This file is part of the FOSUserBundle package.
       
     5  *
       
     6  * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
       
     7  *
       
     8  * For the full copyright and license information, please view the LICENSE
       
     9  * file that was distributed with this source code.
       
    10  */
       
    11 
       
    12 namespace FOS\UserBundle\DependencyInjection;
       
    13 
       
    14 use Symfony\Component\Config\Definition\Processor;
       
    15 use Symfony\Component\HttpKernel\DependencyInjection\Extension;
       
    16 use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
       
    17 use Symfony\Component\DependencyInjection\ContainerBuilder;
       
    18 use Symfony\Component\DependencyInjection\Alias;
       
    19 use Symfony\Component\Config\FileLocator;
       
    20 
       
    21 class FOSUserExtension extends Extension
       
    22 {
       
    23     public function load(array $configs, ContainerBuilder $container)
       
    24     {
       
    25         $processor = new Processor();
       
    26         $configuration = new Configuration();
       
    27 
       
    28         $config = $processor->processConfiguration($configuration, $configs);
       
    29 
       
    30         $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
       
    31 
       
    32         if (!in_array(strtolower($config['db_driver']), array('orm', 'mongodb', 'couchdb'))) {
       
    33             throw new \InvalidArgumentException(sprintf('Invalid db driver "%s".', $config['db_driver']));
       
    34         }
       
    35         $loader->load(sprintf('%s.xml', $config['db_driver']));
       
    36 
       
    37         foreach (array('validator', 'security', 'util', 'mailer') as $basename) {
       
    38             $loader->load(sprintf('%s.xml', $basename));
       
    39         }
       
    40 
       
    41         $container->setAlias('fos_user.mailer', $config['service']['mailer']);
       
    42         $container->setAlias('fos_user.util.email_canonicalizer', $config['service']['email_canonicalizer']);
       
    43         $container->setAlias('fos_user.util.username_canonicalizer', $config['service']['username_canonicalizer']);
       
    44         $container->setAlias('fos_user.user_manager', $config['service']['user_manager']);
       
    45 
       
    46         if ($config['use_listener']) {
       
    47             switch ($config['db_driver']) {
       
    48                 case 'orm':
       
    49                     $container->getDefinition('fos_user.user_listener')->addTag('doctrine.event_subscriber');
       
    50                     break;
       
    51 
       
    52                 case 'mongodb':
       
    53                     $container->getDefinition('fos_user.user_listener')->addTag('doctrine.common.event_subscriber');
       
    54                     break;
       
    55 
       
    56                 case 'couchdb':
       
    57                     $container->getDefinition('fos_user.user_listener')->addTag('doctrine_couchdb.event_subscriber');
       
    58                     break;
       
    59 
       
    60                 default:
       
    61                     break;
       
    62             }
       
    63         }
       
    64         if ($config['use_username_form_type']) {
       
    65             $loader->load('username_form_type.xml');
       
    66         }
       
    67 
       
    68         $this->remapParametersNamespaces($config, $container, array(
       
    69             ''          => array(
       
    70                 'firewall_name' => 'fos_user.firewall_name',
       
    71                 'model_manager_name' => 'fos_user.model_manager_name',
       
    72                 'user_class' => 'fos_user.model.user.class',
       
    73             ),
       
    74             'encoder'   => 'fos_user.encoder.%s',
       
    75             'template'  => 'fos_user.template.%s',
       
    76         ));
       
    77         $container->setParameter(
       
    78             'fos_user.registration.confirmation.from_email',
       
    79             array($config['from_email']['address'] => $config['from_email']['sender_name'])
       
    80         );
       
    81         $container->setParameter(
       
    82             'fos_user.resetting.email.from_email',
       
    83             array($config['from_email']['address'] => $config['from_email']['sender_name'])
       
    84         );
       
    85 
       
    86         // handle the MongoDB document manager name in a specific way as it does not have a registry to make it easy
       
    87         // TODO: change it if https://github.com/symfony/DoctrineMongoDBBundle/pull/31 is merged
       
    88         if ('mongodb' === $config['db_driver']) {
       
    89             if (null === $config['model_manager_name']) {
       
    90                 $container->setAlias(new Alias('fos_user.document_manager', false), 'doctrine.odm.mongodb.document_manager');
       
    91             } else {
       
    92                 $container->setAlias(new Alias('fos_user.document_manager', false), sprintf('doctrine.odm.%s_mongodb.document_manager', $config['model_manager_name']));
       
    93             }
       
    94         }
       
    95 
       
    96         if (!empty($config['profile'])) {
       
    97             $loader->load('profile.xml');
       
    98 
       
    99             $container->setAlias('fos_user.profile.form.handler', $config['profile']['form']['handler']);
       
   100             unset($config['profile']['form']['handler']);
       
   101 
       
   102             $this->remapParametersNamespaces($config['profile'], $container, array(
       
   103                 'form' => 'fos_user.profile.form.%s',
       
   104             ));
       
   105         }
       
   106 
       
   107         if (!empty($config['registration'])) {
       
   108             $loader->load('registration.xml');
       
   109 
       
   110             $container->setAlias('fos_user.registration.form.handler', $config['registration']['form']['handler']);
       
   111             unset($config['registration']['form']['handler']);
       
   112 
       
   113             if (!empty($config['registration']['confirmation']['from_email'])) {
       
   114                 $container->setParameter(
       
   115                     'fos_user.registration.confirmation.from_email',
       
   116                     array($config['registration']['confirmation']['from_email']['address'] => $config['registration']['confirmation']['from_email']['sender_name'])
       
   117                 );
       
   118             }
       
   119             unset($config['registration']['confirmation']['from_email']);
       
   120 
       
   121             $this->remapParametersNamespaces($config['registration'], $container, array(
       
   122                 'confirmation' => 'fos_user.registration.confirmation.%s',
       
   123                 'form' => 'fos_user.registration.form.%s',
       
   124             ));
       
   125         }
       
   126 
       
   127         if (!empty($config['change_password'])) {
       
   128             $loader->load('change_password.xml');
       
   129 
       
   130             $container->setAlias('fos_user.change_password.form.handler', $config['change_password']['form']['handler']);
       
   131             unset($config['change_password']['form']['handler']);
       
   132 
       
   133             $this->remapParametersNamespaces($config['change_password'], $container, array(
       
   134                 'form' => 'fos_user.change_password.form.%s',
       
   135             ));
       
   136         }
       
   137 
       
   138         if (!empty($config['resetting'])) {
       
   139             $loader->load('resetting.xml');
       
   140 
       
   141             $container->setAlias('fos_user.resetting.form.handler', $config['resetting']['form']['handler']);
       
   142             unset($config['resetting']['form']['handler']);
       
   143 
       
   144             if (!empty($config['resetting']['email']['from_email'])) {
       
   145                 $container->setParameter(
       
   146                     'fos_user.resetting.email.from_email',
       
   147                     array($config['resetting']['email']['from_email']['address'] => $config['resetting']['email']['from_email']['sender_name'])
       
   148                 );
       
   149             }
       
   150             unset($config['resetting']['email']['from_email']);
       
   151 
       
   152             $this->remapParametersNamespaces($config['resetting'], $container, array(
       
   153                 '' => array (
       
   154                     'token_ttl' => 'fos_user.resetting.token_ttl',
       
   155                 ),
       
   156                 'email' => 'fos_user.resetting.email.%s',
       
   157                 'form' => 'fos_user.resetting.form.%s',
       
   158             ));
       
   159         }
       
   160 
       
   161         if (!empty($config['group'])) {
       
   162             $loader->load('group.xml');
       
   163             $loader->load(sprintf('%s_group.xml', $config['db_driver']));
       
   164 
       
   165             $container->setAlias('fos_user.group_manager', $config['group']['group_manager']);
       
   166             $container->setAlias('fos_user.group.form.handler', $config['group']['form']['handler']);
       
   167             unset($config['group']['form']['handler']);
       
   168 
       
   169             $this->remapParametersNamespaces($config['group'], $container, array(
       
   170                 '' => array(
       
   171                     'group_class' => 'fos_user.model.group.class',
       
   172                 ),
       
   173                 'form' => 'fos_user.group.form.%s',
       
   174             ));
       
   175         }
       
   176     }
       
   177 
       
   178     protected function remapParameters(array $config, ContainerBuilder $container, array $map)
       
   179     {
       
   180         foreach ($map as $name => $paramName) {
       
   181             if (array_key_exists($name, $config)) {
       
   182                 $container->setParameter($paramName, $config[$name]);
       
   183             }
       
   184         }
       
   185     }
       
   186 
       
   187     protected function remapParametersNamespaces(array $config, ContainerBuilder $container, array $namespaces)
       
   188     {
       
   189         foreach ($namespaces as $ns => $map) {
       
   190             if ($ns) {
       
   191                 if (!array_key_exists($ns, $config)) {
       
   192                     continue;
       
   193                 }
       
   194                 $namespaceConfig = $config[$ns];
       
   195             } else {
       
   196                 $namespaceConfig = $config;
       
   197             }
       
   198             if (is_array($map)) {
       
   199                 $this->remapParameters($namespaceConfig, $container, $map);
       
   200             } else {
       
   201                 foreach ($namespaceConfig as $name => $value) {
       
   202                     $container->setParameter(sprintf($map, $name), $value);
       
   203                 }
       
   204             }
       
   205         }
       
   206     }
       
   207 }