6

各ユーザーが独自のデータベースを持つ Symfony 2 プロジェクトに取り組んでいます。私の config.yml ファイルには、クライアント用に doctrine:dbal:orm が設定されていますが、実行時に設定され、すべてのユーザーによって参照されるため、接続プロパティはありません。つまり、デフォルトの dbal 接続が 1 つと orm-connection が 2 つしかなく、ユーザー数は無制限です。

これは問題なく動作しますが、ユーザーの登録時にデータベースとスキーマを作成する必要があります (FOS UserBundle)。拡張された userbundle コントローラーでは、独自のロジックを配置できます。問題は、新しいユーザーに設定されたパラメーターがないため、「php app/console doctrine:database:create」を実行できないことです。

コンソール コマンドにカスタム データベース パラメータを指定する方法はありますか? おそらく、いくつかの非常に醜いmysqlコマンドでこれを回避できますが、むしろそうはしません。よろしくお願いします!

4

1 に答える 1

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;
    }
}
于 2013-03-29T20:22:50.563 に答える