5

クラスを介してデータベースからエンティティを作成しています\Doctrine\ORM\Tools\DisconnectedClassMetadataFactory()。これは完璧に機能します!名前空間の生成を除きます。名前空間は生成されません。エンティティを に保存していApp/Model/Entitiesます。

ジェネレーターに名前空間をエンティティに追加させる方法を知っている人はいますか?

これは、エンティティを生成するために使用するコードです。

<?php
$em->getConfiguration()->setMetadataDriverImpl(
    new \Doctrine\ORM\Mapping\Driver\DatabaseDriver(
        $em->getConnection()->getSchemaManager()
    )
);

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

// GENERATE PHP ENTITIES!
$entityGenerator = new \Doctrine\ORM\Tools\EntityGenerator(); 
$entityGenerator->setGenerateAnnotations(true); 
$entityGenerator->setGenerateStubMethods(true); 
$entityGenerator->setRegenerateEntityIfExists(false); 
$entityGenerator->setUpdateEntityIfExists(true); 
$entityGenerator->generate($metadata, __dir__. '/Model/Entities");
4

3 に答える 3

9

より良い方法は、名前空間を直接ドライバーに設定することだと思います

<?php
$driver = new \Doctrine\ORM\Mapping\Driver\DatabaseDriver($em->getConnection()->getSchemaManager());
$driver->setNamespace('App\\Model\\Entities\\');

$em->getConfiguration()->setMetadataDriverImpl($driver);

....
于 2012-11-16T13:22:25.987 に答える
4

EntityGeneratorはメタデータから名前空間情報を取得するため、データベースからインポートするときに名前空間を設定できるとは思いません。データベースには名前空間がないか、名前空間が必要ないため、情報はそこから自動的に取得されません。

$ metadataオブジェクトをループして、名前空間を自分でクラス名に追加してみてください。名前空間を取得するEntityGeneratorのコードは非常に単純です。

private function _getNamespace(ClassMetadataInfo $metadata)
{
    return substr($metadata->name, 0, strrpos($metadata->name, '\\'));
}

他のすべてが失敗した場合は、使用する名前空間をフィードできる独自のEntityGeneratorをいつでも実装できます。これは、生成中に実行する他のカスタムタスクがいくつかある大規模なプロジェクトで行いました。ただし、EntityGeneratorは簡単にオーバーライドできず、多くのプライベートメソッドとプロパティがあるため、おそらくすべてをコピーして貼り付ける必要があります。

于 2012-09-28T13:36:29.703 に答える
-3

この PHP スクリプトを使用して、データベース テーブルからエンティティを生成できます。このスクリプトは、生成されたファイルにサンプルの名前空間を追加するため、代わりに名前空間を設定できます。 https://gist.github.com/SamvelG/3b39622844f23cac7e76#file-doctrine-entity-generator-php

于 2015-04-08T11:49:27.587 に答える