Symfony 2 Console命令用于创建自定义数据库

时间:2013-03-21 11:34:07

标签: mysql symfony console doctrine dbal

我正在开发一个Symfony 2项目,每个用户都拥有自己的数据库。在我的config.yml文件中,我有一个学说:dbal:orm为客户端设置但没有连接属性,因为它们在运行时设置并由所有用户引用。我只有一个默认的dbal连接和两个orm-connection,用户数量是无限的。

这很好但我需要在注册用户时创建数据库和模式(FOS UserBundle)。在扩展的userbundle控制器中,我可以使用自己的逻辑。 问题是我无法运行'php app / console doctrine:database:create',因为没有为新用户设置参数。

有没有办法为控制台命令指定自定义数据库参数? 我可能会通过一些非常丑陋的mysql命令解决这个问题,但我宁愿不这样做。 非常感谢提前!

1 个答案:

答案 0 :(得分:1)

您可以使用以下代码作为大纲创建自己的命令:

namespace Doctrine\Bundle\DoctrineBundle\Command;

use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Doctrine\DBAL\DriverManager;

class CreateDatabaseDoctrineCommandDynamically extends DoctrineCommand
{

    protected function configure()
    {
        $this
            ->setName('doctrine:database:createdynamic')
            ->setDescription('Creates the configured databases');
    }

    /**
     * {@inheritDoc}
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
    /***
        **   Edit this part below to get the database configuration however you want
        **/
        $connectionFactory = $this->container->get('doctrine.dbal.connection_factory');
        $connection = $connectionFactory->createConnection(array(
        'driver' => 'pdo_mysql',
         'user' => 'root',
         'password' => '',
         'host' => 'localhost',
         'dbname' => 'foo_database',
        ));

        $params = $connection->getParams();
        $name = isset($params['path']) ? $params['path'] : $params['dbname'];

        unset($params['dbname']);

        $tmpConnection = DriverManager::getConnection($params);

        // Only quote if we don't have a path
        if (!isset($params['path'])) {
            $name = $tmpConnection->getDatabasePlatform()->quoteSingleIdentifier($name);
        }

        $error = false;
        try {
            $tmpConnection->getSchemaManager()->createDatabase($name);
            $output->writeln(sprintf('<info>Created database for connection named <comment>%s</comment></info>', $name));
        } catch (\Exception $e) {
            $output->writeln(sprintf('<error>Could not create database for connection named <comment>%s</comment></error>', $name));
            $output->writeln(sprintf('<error>%s</error>', $e->getMessage()));
            $error = true;
        }

        $tmpConnection->close();

        return $error ? 1 : 0;
    }
}