4

Symfony2では、次の例のように新しいエンティティを定義できることを知っています。

use Acme\StoreBundle\Entity\Product;

public function defaultController() {
    $product = new Product();
    $product->setName('Pippo');
    $product->setPrice(19.99);
    ....
    // Use Doctrine EntityManager to store the Product object
}

Productクラスの名前空間が「AcmeHomeBundle:Product 」であることがわかっているとします。名前空間を使用して(たとえば、EntityManagerなどを使用して)$productオブジェクトを作成すると便利です。

public function defaultController() {
    $item = createObjectFromNamespace("AcmeHomeBundle:Product");
    $item->setName('Pippo');
    $item->setPrice(19.99);
    ....
    // Use Doctrine EntityManager to store the Item object
}

これが可能かどうか知っていますか?

エンティティタイプを提供する文字列があるとします

4

3 に答える 3

10

あなたはこれをするべきです...

$entityInfo = $this->em->getClassMetadata("entityNameSpace:entityName");
$entityMember = $entityInfo->newInstance();

文字列によるセッターメソッドを使用する場合:

$entitySetMethod = "set".\ucfirst("entityDataMemberName");
\call_user_func(array($entityMember, $entitySetMethod), $parameter);
于 2012-05-22T12:18:17.873 に答える
2

あなたが本当にしたいのであれば、あなたはこれを行うことができます:

$product = new Acme\JournalBundle\Entity\Product();
$article = new Acme\JournalBundle\Entity\Article();

ただし、その名前空間に新しいエンティティを作成するたびに、入力する必要があります。クラスの最上位でuseステートメントを使用しただけの場合:

use Acme\JournalBundle\Entity\Product,
    Acme\JournalBundle\Entity\Article;

次に、簡単な方法で新しい記事や製品を作成できます。

$product = new Product();
$article = new Article();

彼らは同じことをします。

于 2012-05-18T16:28:50.687 に答える
0

Acme \ StoreBundle \ Entity\Product エンティティの名前空間です。AcmeStoreBundle:Productは、実際の名前空間のより短い代替としてDQLで使用される名前空間の単なるエイリアスです。

エイリアス化された名前空間でオブジェクトを作成したいのはなぜですか?エイリアスを使用してある種のファクトリを作成し、それを実際の名前空間にマップし、オブジェクトを作成して返すことができると思います。しかし、ポイントは何ですか?

エンティティエイリアスは、構成を介して定義されます:http: //www.doctrine-project.org/api/orm/2.2/source-class-Doctrine.ORM.Configuration.html#153

それらを設定するだけでなく、取得することもできるため、この機能が本当に必要な場合は、構成インスタンスを使用してこれを実行できるはずです。

Doctrineのドキュメントでエンティティエイリアスについて何かを見つけるのは難しいです。symfonyのドキュメントはそれの目的を少し説明しています:

エイリアス-Doctrineは、エンティティの名前空間を、DQLクエリまたはリポジトリアクセスに使用される、より単純で短い名前にエイリアスする方法を提供します。バンドルを使用する場合、エイリアスはデフォルトでバンドル名になります。

于 2012-05-18T13:21:32.763 に答える