0

Doctrine を使用して ZF3 PHP プロジェクトを開始するためにデータベースをインポートしようとしています。

データベースからエンティティを作成する方法に関するこのチュートリアルを読み、次のコマンドを発行しました。

$ cd myproject
$ ./vendor/bin/doctrine-module mapping:import

そして、このエラーが発生しました:

[Symfony\Component\Console\Exception\CommandNotFoundException]
There are no commands defined in the "mapping" namespace.

The command:

$ ./vendor/bin/doctrine-module list

利用可能なコマンドをリストします。orm:migration:およびのみdbal:がリストされ、mapping:コマンドはまったくありません。

ここでインストールフェーズが欠落していますか?

4

1 に答える 1

1

:mappingDoctrine Tools 内にマッピング コマンドがないため、見逃すことはありません。Doctrine Symfony Bundle はおそらく独自のコマンドを作成し、それを Doctrine Tools 内の別のコマンドに転送します。(確認できる Symfony の知識を持っている人はいますか? )。ZFの使用についてphp /vendor/bin/doctrine-module listは、Doctrine ツールのすべてのコマンドを一覧表示します。Doctrine ORM Toolsを見てください。

ドキュメント内で説明されているように、おそらくリバース エンジニアリングを使用する必要があります。私が理解したように、既存のデータベースからモデル/エンティティを作成したいと考えています。

ただし、データベースをモデルにリバース エンジニアリングする前に、Doctrine で述べられている次のことを考慮する必要があります。

リバース エンジニアリングは、プロジェクトを開始できる 1 回限りのプロセスです。既存のデータベース スキーマをマッピング ファイルに変換しても、必要なマッピング情報の約 70 ~ 80% しか検出されません。さらに、既存のデータベースからの検出では、逆関連付け、継承タイプ、主キーとして外部キーを持つエンティティ、およびカスケードなどの関連付けに対する多くの意味操作を検出できません。

また、作成されたものを確認し、必要に応じて修正する必要があるため、これは重要になる可能性があるため、次の点に注意してください。

特殊なケースによっては、リバース エンジニアリングが常に完全に機能するとは限りません。多対一の関係のみを検出し (一対一であっても)、多対多のテーブルからエンティティを作成しようとします。複数の列名を持つ外部キーの命名にも問題があります。リバース エンジニアリングされたデータベース スキーマは、有用なドメイン モデルになるためにかなりの手作業が必要です。

また、Doctrine の Zend Framework 統合を支援するために Symfony 3 のドキュメントを使用しないでください。どちらにも独自の方法があります (バンドルとモジュール)。確かに、Symfony バンドルまたは Zend モジュール内のいくつかのものは一致していますが、それは Doctrine 自体が提供するツールに基づいているだけです。

コメントがあったので修正

コメントで述べたように、どのコマンドが Symfony コマンドを置き換えるかは明確ではありません: $ php bin/console doctrine:mapping:import --force AcmeBlogBundle xml. ZF2/3 アプリケーション内では、Doctrine (ORM) モジュール内で即座にマッピングを生成するこの機能がありません。Symfony と同様に、エンティティを生成するバンドルを指定できます。これは、Symfony 内でビルドされる特定のものです。これを模倣するには、Zend Framework アプリケーション内で自分で行います。

ZF アプリケーション内で、そのために独自のタスクを作成する必要があるため、EntityManager にアクセスできる場所でこのジョブを作成する必要があります。

    /** @var \Doctrine\Orm\EntityManager $em */
    $em = $this->getEntityManager();
    $em->getConfiguration()->setMetadataDriverImpl(
        new \Doctrine\ORM\Mapping\Driver\DatabaseDriver(
            $em->getConnection()->getSchemaManager()
        )
    );

    $cmf = new \Doctrine\Orm\Tools\DisconnectedClassMetadataFactory();
    $cmf->setEntityManager($em);
    $metadata = $cmf->getAllMetadata();

    $cme = new \Doctrine\Orm\Tools\Export\ClassMetadataExporter();
    //$_exporterDrivers = array(
    //    'xml' => 'Doctrine\ORM\Tools\Export\Driver\XmlExporter',
    //    'yaml' => 'Doctrine\ORM\Tools\Export\Driver\YamlExporter',
    //    'yml' => 'Doctrine\ORM\Tools\Export\Driver\YamlExporter',
    //    'php' => 'Doctrine\ORM\Tools\Export\Driver\PhpExporter',
    //    'annotation' => 'Doctrine\ORM\Tools\Export\Driver\AnnotationExporter'
    //);
    $exporter = $cme->getExporter('xml', '/path/to/export/xml');
    $exporter->setMetadata($metadata);
    $exporter->export();

たとえばModule.php、あなたのアプリケーションモジュールで。このメソッドを追加します。public function onBootstrap(MvcEvent $event)

class Module
{

    public function onBootstrap(\Zend\Mvc\MvcEvent $event)
    {
        $entityManager = $event->getApplication()->getServiceManager()->get('doctrine.entitymanager.orm_default');

        // code block above
        // remove this code when export is done
    }
}

指定した XML ファイルまたはファイル タイプ内のメタデータを取得したので、次のコマンドを使用してエンティティを作成できます。

$ php doctrine orm:convert-mapping --from-database xml /path/to/mapping-path-converted-to-xml

Doctrine モジュールのユーザー:

$ php /vendor/bin/doctrine-module orm:convert-mapping --from-database xml /path/to/mapping-path-converted-to-xml
于 2016-11-25T09:13:11.833 に答える