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 

テーブルを正常に作成します。また、正常に動作するように、TestBundle から製品にアクセスしCoreArticleBundle:Productます。バンドル構成などを比較しようとしましたが、何も思いつきませんでした。

また、次のように db 作成スクリプトを実行します。

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

dev という名前の接続の削除されたデータベース

$ php app/console doctrine:database:create 

dev という名前の接続用のデータベースが作成されました。Product 以外のすべてのテーブルが作成されました。

さらに、Product オブジェクトを使用してフィクスチャを作成しました。同じこと。既存のバンドルにある場合に機能します。新しく作成されたバンドルで上記と同じエラー。

4

2 に答える 2

2

地元の専門家に話を聞いた。アプリケーションが 2 つの ORM マネージャーを使用していることがわかりました。このような場合、ORM を使用する各バンドルを app/config/config.yml に登録する必要があります。すなわち

entity_managers:
        sql_write:
            connection: sql_write
            mappings:
                CoreUserBundle : ~
                CoreImageBundle : ~
                CoreTestBundle : ~
于 2012-09-10T18:22:52.913 に答える
0

doctrine:schema:validate はエラーを見つけるのに役立ちます... マッピングをチェックし、マッピングがデータベースと同期しているかどうかをチェックします。

于 2012-09-05T13:57:52.413 に答える