diff --git a/src/Symfony/Bundle/SecurityBundle/Command/InitAclCommand.php b/src/Symfony/Bundle/SecurityBundle/Command/InitAclCommand.php index 0821b42363..5c14a3b58e 100644 --- a/src/Symfony/Bundle/SecurityBundle/Command/InitAclCommand.php +++ b/src/Symfony/Bundle/SecurityBundle/Command/InitAclCommand.php @@ -15,6 +15,7 @@ use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; use Symfony\Component\Security\Acl\Dbal\Schema; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; +use Doctrine\DBAL\Schema\SchemaException; /** * Installs the tables required by the ACL system @@ -50,26 +51,19 @@ EOT */ protected function execute(InputInterface $input, OutputInterface $output) { - $connection = $this->getContainer()->get('security.acl.dbal.connection'); - $sm = $connection->getSchemaManager(); - $tableNames = $sm->listTableNames(); - $tables = array( - 'class_table_name' => $this->getContainer()->getParameter('security.acl.dbal.class_table_name'), - 'sid_table_name' => $this->getContainer()->getParameter('security.acl.dbal.sid_table_name'), - 'oid_table_name' => $this->getContainer()->getParameter('security.acl.dbal.oid_table_name'), - 'oid_ancestors_table_name' => $this->getContainer()->getParameter('security.acl.dbal.oid_ancestors_table_name'), - 'entry_table_name' => $this->getContainer()->getParameter('security.acl.dbal.entry_table_name'), - ); + $container = $this->getContainer(); - foreach ($tables as $table) { - if (in_array($table, $tableNames, true)) { - $output->writeln(sprintf('The table "%s" already exists. Aborting.', $table)); + $connection = $container->get('security.acl.dbal.connection'); + $schema = $container->get('security.acl.dbal.schema'); - return; - } + try { + $schema->addToSchema($connection->getSchemaManager()->createSchema()); + } catch (SchemaException $e) { + $output->writeln("Aborting: " . $e->getMessage()); + + return; } - $schema = new Schema($tables, $sm->createSchemaConfig()); foreach ($schema->toSql($connection->getDatabasePlatform()) as $sql) { $connection->exec($sql); } diff --git a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php index 5f975628ef..30dd54be57 100644 --- a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php +++ b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php @@ -89,7 +89,11 @@ class MainConfiguration implements ConfigurationInterface ->children() ->arrayNode('acl') ->children() - ->scalarNode('connection')->setInfo('any name configured in doctrine.dbal section')->end() + ->scalarNode('connection') + ->defaultValue('default') + ->cannotBeEmpty() + ->setInfo('any name configured in doctrine.dbal section') + ->end() ->arrayNode('cache') ->addDefaultsIfNotSet() ->children() diff --git a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php index 14f36b1372..0fb4929362 100644 --- a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php +++ b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php @@ -133,9 +133,16 @@ class SecurityExtension extends Extension { $loader->load('security_acl_dbal.xml'); - if (isset($config['connection'])) { - $container->setAlias('security.acl.dbal.connection', sprintf('doctrine.dbal.%s_connection', $config['connection'])); - } + $container->setAlias('security.acl.dbal.connection', sprintf('doctrine.dbal.%s_connection', $config['connection'])); + + $container + ->getDefinition('security.acl.dbal.schema_listener') + ->addTag('doctrine.event_listener', array( + 'connection' => $config['connection'], + 'event' => 'postGenerateSchema' + )) + ; + $container->getDefinition('security.acl.cache.doctrine')->addArgument($config['cache']['prefix']); $container->setParameter('security.acl.dbal.class_table_name', $config['tables']['class']); diff --git a/src/Symfony/Bundle/SecurityBundle/EventListener/AclSchemaListener.php b/src/Symfony/Bundle/SecurityBundle/EventListener/AclSchemaListener.php new file mode 100644 index 0000000000..2e8b191676 --- /dev/null +++ b/src/Symfony/Bundle/SecurityBundle/EventListener/AclSchemaListener.php @@ -0,0 +1,36 @@ + + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace Symfony\Bundle\SecurityBundle\EventListener; + +use Symfony\Component\DependencyInjection\ContainerInterface; +use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs; + +/** + * Merges ACL schema into the given schema. + * + * @author Johannes M. Schmitt + */ +class AclSchemaListener +{ + private $container; + + public function __construct(ContainerInterface $container) + { + $this->container = $container; + } + + public function postGenerateSchema(GenerateSchemaEventArgs $args) + { + $schema = $args->getSchema(); + $this->container->get('security.acl.dbal.schema')->addToSchema($schema); + } +} \ No newline at end of file diff --git a/src/Symfony/Bundle/SecurityBundle/Resources/config/security_acl_dbal.xml b/src/Symfony/Bundle/SecurityBundle/Resources/config/security_acl_dbal.xml index e1f36cabc3..6a921159b7 100644 --- a/src/Symfony/Bundle/SecurityBundle/Resources/config/security_acl_dbal.xml +++ b/src/Symfony/Bundle/SecurityBundle/Resources/config/security_acl_dbal.xml @@ -6,6 +6,8 @@ Symfony\Component\Security\Acl\Dbal\MutableAclProvider + Symfony\Component\Security\Acl\Dbal\Schema + Symfony\Bundle\SecurityBundle\EventListener\AclSchemaListener @@ -24,6 +26,20 @@ + + + %security.acl.dbal.class_table_name% + %security.acl.dbal.entry_table_name% + %security.acl.dbal.oid_table_name% + %security.acl.dbal.oid_ancestors_table_name% + %security.acl.dbal.sid_table_name% + + + + + + + diff --git a/src/Symfony/Component/Security/Acl/Dbal/Schema.php b/src/Symfony/Component/Security/Acl/Dbal/Schema.php index 010a51e2ce..97376acac6 100644 --- a/src/Symfony/Component/Security/Acl/Dbal/Schema.php +++ b/src/Symfony/Component/Security/Acl/Dbal/Schema.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Security\Acl\Dbal; use Doctrine\DBAL\Schema\Schema as BaseSchema; use Doctrine\DBAL\Schema\SchemaConfig; +use Doctrine\DBAL\Connection; /** * The schema used for the ACL system. @@ -26,11 +27,13 @@ final class Schema extends BaseSchema /** * Constructor * - * @param array $options the names for tables - * @param SchemaConfig $schemaConfig + * @param array $options the names for tables + * @param Connection $connection */ - public function __construct(array $options, SchemaConfig $schemaConfig = null) + public function __construct(array $options, Connection $connection = null) { + $schemaConfig = null === $connection ? null : $connection->getSchemaManager()->createSchemaConfig(); + parent::__construct(array(), array(), $schemaConfig); $this->options = $options; @@ -42,6 +45,22 @@ final class Schema extends BaseSchema $this->addEntryTable(); } + /** + * Merges ACL schema with the given schema. + * + * @param BaseSchema $schema + */ + public function addToSchema(BaseSchema $schema) + { + foreach ($this->getTables() as $table) { + $schema->_addTable($table); + } + + foreach ($this->getSequences() as $sequence) { + $schema->_addSequence($sequence); + } + } + /** * Adds the class table to the schema */