4

Doctrine ORM を (Symfony 以外の) プロジェクトに統合したいと考えています。私はすでに別のプロジェクトでこれを行っており、有名なcli-config.phpものをプロジェクトのルート ディレクトリに使用しました。

しかし今、私の新しいプロジェクトでは、Symfony Console コンポーネントと Dependency Injection コンポーネントを使用しています (サービスとコマンドをタグ付けして参照するため)。

1.cli-config.phpプロジェクトのルートにa を絶対に入れたくありません。Sf Doctrine Bundle はどのようにこれを行いますか?

2.また (あまり重要ではありませんが)、私のプロジェクト CLI に Doctrine コマンドを入れたいと思っています。これを行う最良の方法は何ですか?Doctrine コマンドへの参照を my services.yml?に作成します。または、PHP 経由で Doctrine コマンドを呼び出すローカルの「デコレータ コマンド」を作成しますか?

4

1 に答える 1

4

最後に、いくつかのグーグルと実験の後、完全な解決策を見つけました。

のdoctrine.phpを読んでくださいvendor/binconfig-cli.phpハードコーディングされたファイルを回避するのは非常に簡単です。

1. エンティティ マネージャーを作成する

私の場合は、ファクトリを使用しており、この方法でdoctrine.emサービスがハイドレートされます。

($config私のアプリに固有のものです。独自のロジックを使用するように値を変更してください。)

use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;

public function createEntityManager()
{
    $config = $this->get('config');

    $metadataConfig = Setup::createAnnotationMetadataConfiguration(
        [$config->meta('app_path') . '/Entity'],
        $config->oc->doctrine->dev_mode
    );

    return EntityManager::create((array) $config->oc->doctrine->connection, $metadataConfig);
}

2. CLI コマンドに Doctrine CLI コマンドをマージする

一部の のように、コードの一部で、おそらくコマンドラインインターフェイスをbootstrap.php宣言します。それが私がこれを行う方法です(ファイルで定義されたコマンドを単に追加します):Symfony\Component\Console\Applicationforeachservices.yml

$application = new Application('MyApp CLI', '0.0.1');

$services = $container->findTaggedServiceIds('oc.command');

foreach(array_keys($services) as $serviceId)
{
    $application->add($container->get($serviceId));
}

$application->run();

それでは、Doctrine にそのコマンドをアプリケーションに注入するように依頼します。

$application = new Application('MyApp CLI', '0.0.1');

$helperSet = ConsoleRunner::createHelperSet($container->get('doctrine.em'));
$application->setHelperSet($helperSet);

ConsoleRunner::addCommands($application);

$services = $container->findTaggedServiceIds('oc.command');

foreach(array_keys($services) as $serviceId)
{
    $application->add($container->get($serviceId));
}

$application->run();

それでおしまい!この GitHub の問題に関する arsfeld の回答を使用して、Doctrine コマンドのサブセットのみを追加することもできます。

3. おまけ: 必要なコマンドのみをインポートして名前を変更する

Doctrine コマンドを継承するデコレータ コマンドを作成できます (これは、Doctrine コマンドの名前を再定義するのに役立ちます。これは、Symfony Doctrine Bundle が行うように、orm:validate-schema->doctrine:schema:validateなどです)。

これを行うにはConsoleRunner::addCommands($application);、手順 2 で追加した行を削除します。再定義するコマンドごとに、アプリで新しいコマンドを登録する必要があります。このコマンドはextends対象の Doctrine コマンド " " になり、configure()メソッドをオーバーライドします。

を使用した例を次に示しorm:validate-schemaます。

<?php

namespace MyApp\Command\Doctrine;

use Doctrine\ORM\Tools\Console\Command\ValidateSchemaCommand;

class SchemaValidateCommand extends ValidateSchemaCommand
{
    protected function configure()
    {
        parent::configure();
        $this->setName('doctrine:schema:validate');
    }
}

一部の Doctrine コマンドには、 や など、コマンドの名前空間を汚染するエイリアスがorm:generate-entitiesありorm:generate:entitiesます。これらのエイリアスを削除するにはconfigure()、 に を追加し->setAliases(array())ます。

$this->setName('doctrine:generate:entities')->setAliases([]);

おめでとうございます。Symfony Doctrine Bundle をやり直しました:p (jk)

于 2015-02-07T18:25:40.500 に答える