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();

如果你想通过字符串使用 setter 方法:

$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

您不仅可以设置它们,还可以检索它们,因此如果您确实需要此功能,您应该能够使用 Configuration 实例来执行此操作。

在 Doctrine 文档中很难找到有关实体别名的任何信息。Symfony 文档稍微解释了它的目的

alias - Doctrine 提供了一种将实体命名空间别名为更简单、更短的名称的方法,以便在 DQL 查询或存储库访问中使用。使用捆绑包时,别名默认为捆绑包名称。

于 2012-05-18T13:21:32.763 回答