Symfony 2.1 Doctrine in Newly Created Bundles

时间:2012-09-04 15:17:44

标签: php symfony doctrine-orm symfony-2.1

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

以下是步骤。

$ 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访问产品也可以正常工作。 我试图比较捆绑配置等,但无法想出任何东西。

我还运行db创建脚本,如下所示。

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

已删除名为dev

的连接的数据库
$ php app/console doctrine:database:create 

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

此外,我使用Product对象创建了一个fixture。一样。在现有捆绑中工作。与新创建的包中的错误相同。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

一个学说:schema:validate应该可以帮助你找到错误......它将检查你的映射,并检查映射是否与数据库同步。