Symfony 2.1原则在新创建的Bundles


Symfony 2.1 Doctrine in Newly Created Bundles

想知道是否有其他人遇到过这个问题。总之,我们从Symfony 2.0升级到了Symfony 2.1。使用Symfony 2.1,如果创建一个全新的捆绑包,然后创建一个实体与Doctrine一起使用,我会得到一个"not a valid entity or mapped super class"。如果我将相同的实体类(经过适当的路径更改)放入现有的bundle(在2.1之前创建)中,即使从新的bundle也可以毫无问题地访问它。

以下是步骤。

$ php app/console generate:bundle --namespace="Core/TestBundle"--format=yml --no-interaction --structure=no --dir=src 
$ php app/console doctrine:generate:entity --entity="CoreTestBundle:Product" --fields="name:string(255) price:float description:text" 

这是生成的Product.php代码

<?php
namespace Core'TestBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
/**
 * Core'TestBundle'Entity'Product
 *
 * @ORM'Table()
 * @ORM'Entity
 */
class Product
{
/**
 * @var integer $id
 *
 * @ORM'Column(name="id", type="integer")
 * @ORM'Id
 * @ORM'GeneratedValue(strategy="AUTO")
 */
private $id;
/**
 * @var string $name
 *
 * @ORM'Column(name="name", type="string", length=255)
 */
private $name;
/**
 * @var float $price
 *
 * @ORM'Column(name="price", type="float")
 */
private $price;
/**
 * @var text $description
 *
 * @ORM'Column(name="description", type="text")
 */
private $description;

/**
 * Get id
 *
 * @return integer
 */
public function getId()
{
    return $this->id;
}
/**
 * Set name
 *
 * @param string $name
 * @return Product
 */
public function setName($name)
{
    $this->name = $name;
    return $this;
}
/**
 * Get name
 *
 * @return string
 */
public function getName()
{
    return $this->name;
}
/**
 * Set price
 *
 * @param float $price
 * @return Product
 */
public function setPrice($price)
{
    $this->price = $price;
    return $this;
}
/**
 * Get price
 *
 * @return float
 */
public function getPrice()
{
    return $this->price;
}
/**
 * Set description
 *
 * @param text $description
 * @return Product
 */
public function setDescription($description)
{
    $this->description = $description;
    return $this;
}
/**
 * Get description
 *
 * @return text
 */
public function getDescription()
{
    return $this->description;
}
}

从这里运行

$ php app/console doctrine:generate:entities "Core/TestBundle/Entity/Product" 

或从代码访问产品运行到
[Doctrine'ORM'Mapping'MappingException] Class Core'TestBundle'Entity'Product is not a valid entity or mapped super class.运行
$ php app/console doctrine:schema:update --force生成"无需更新"

另一方面,如果我使用预先存在的捆绑包,如ArticleBundle,并运行相同的命令,即

$ php app/console doctrine:generate:entity --entity="CoreArticleBundle:Product" --fields="name:string(255) price:float description:text"
$ php app/console doctrine:generate:entities "Core/ArticleBundle/Entity/Product"
$ php app/console doctrine:schema:update --force 

创建表格精细此外,以CoreArticleBundle:Product的形式从TestBundle访问产品也很好。我试着比较捆绑包的配置等,但什么都拿不出来。

我还按如下方式运行数据库创建脚本。

$ php app/console doctrine:database:drop --force 

已删除名为dev 的连接的数据库

$ php app/console doctrine:database:create 

已为名为dev的连接创建数据库除了Product表外,所有表都已创建。

此外,我还创建了一个带有Product对象的fixture。同样的事情。在现有捆绑包中工作。在新创建的捆绑包中出现与上述错误相同的错误。

与当地专家交谈。我们的应用程序使用了两个ORM管理器。在这种情况下,每个使用ORM的捆绑包都必须在app/config/config.yml.ie 中注册

entity_managers:
        sql_write:
            connection: sql_write
            mappings:
                CoreUserBundle : ~
                CoreImageBundle : ~
                CoreTestBundle : ~

一个原则:模式:验证应该能帮助你发现错误。。。它将检查您的映射,并检查映射是否与数据库同步。