2015-04-03 108 views
5

我有一個非常簡單的數據庫,我試圖導入並創建實體。 Doctrine(Symfony)能夠從數據庫生成YML映射文件。但是,當我subsiquently嘗試生成實體,我得到以下錯誤:Symfony2/Doctrine2試圖生成實體時無效映射文件異常

[Doctrine\Common\Persistence\Mapping\MappingException] 
Invalid mapping file 'SandboxBundle.Entity.Product.orm.yml' for class 
'SandboxBundle\Entity\Product'. 

的YML文件看起來好像沒什麼問題,正如我們期望的是,它是由學說產生。只是可以肯定的,我檢查了一個在線的yml驗證程序,它說這是確定的。我用來嘗試生成實體的命令是:

app/console generate:doctrine:entities sandbox 

接下來是.yml文件。請原諒在此粘貼文件導致的任何yml間距錯誤。正如我所說的,yml文件是由教條生成的,並且通過了在線驗證。

Product: 
    type: entity 
    table: product 
    indexes: 
     category_id: 
      columns: 
       - category_id 
    id: 
     id: 
      type: integer 
      nullable: false 
      unsigned: false 
      comment: '' 
      id: true 
      generator: 
       strategy: IDENTITY 
    fields: 
     productname: 
      type: string 
      nullable: true 
      length: 10 
      fixed: false 
      comment: '' 
     categoryId: 
      type: integer 
      nullable: true 
      unsigned: false 
      comment: '' 
      column: category_id 
lifecycleCallbacks: { } 

爲了完整起見,這裏是Category yml文件。該錯誤在產品上,但我認爲這是因爲產品首先被處理。

Category: 
    type: entity 
    table: category 
     id: 
      id: 
       type: integer 
       nullable: false 
       unsigned: false 
       comment: '' 
       id: true 
       generator: 
        strategy: IDENTITY 
     fields: 
      categoryname: 
       type: string 
       nullable: true 
       length: 50 
       fixed: false 
       comment: '' 
     lifecycleCallbacks: { } 

我在網上搜索了與診斷映射例外有關的任何資源,但沒有找到任何資源。我認爲在YML文件中有一些東西會導致實體生成器窒息。但是,錯誤信息並沒有說明可能是什麼。我看到Stack Overflow上有很多這類問題的實例。能夠獲得關於如何診斷這些類型的錯誤的信息是非常好的,因此能夠爲我們自己弄清楚。

+0

唐,它不是一個解決方案,但你可以選擇使用'verbose'選項運行'生成實體'命令,這將爲您提供一個PHP堆棧轉儲,然後您可以開始深入研究Doctrine代碼,至少可以查看失敗的原因,然而,如果你打算開始在供應商代碼中添加代碼,添加診斷「print_」語句等,你在Symfony的測試實例中執行這個測試,這是專門爲此目的而創建的。 。 – 2015-04-03 19:25:46

回答

10

doc形容:

class-names specified in the YAML files should be fully qualified.

因此,嘗試改變產品YAML定義如下:

SandboxBundle\Entity\Product: 
    type: entity 
    table: product 
    indexes: 
    ..... 

做相同的其他映射文件。

希望這有助於

+0

不,即使當我添加完全限定名時,仍然有同樣的錯誤。正如我所說,這些YML文件是由Doctrine生成的。不過謝謝你的努力。 – 2015-04-04 15:48:00

0

使用

PHP應用程序/控制檯學說:生成:實體

由學說自動生成的實體。 您已經使用

應用程序/控制檯學說:生成:實體實體名稱

我的意思是

應用程序/控制檯產生:學說:實體實體名稱

(注意複數的 「實體」 字)你命令是生成現有實體的更新屬性並生成其getter和setter方法,但不生成實體。

我的建議是:

  1. 刪除現有的實體
  2. 再次使用正確的命令生成它們。
2

嘗試將文件

SandboxBundle.Entity.Product.orm.yml 

重命名爲

Product.orm.yml 

,並確保在YAML完全限定你的名字

SandboxBundle\Entity\Product: 
type: entity 
table: product 
indexes: 
..... 

你可能會得到一個錯誤,因爲的雙重命名空間。 Symfony將文件的虛線部分添加到名稱空間。

[Doctrine\Common\Persistence\Mapping\MappingException] 
Invalid mapping file 'SandboxBundle.Entity.SandboxBundle.Entity.Product.orm.yml' for class 
'SandboxBundle\Entity\SandboxBundle\Entity\Product'. 

祝你好運:)

+0

正確的提示! – 2018-01-25 16:34:17

0

最近,我遇到了類似 「MappingException:無效的映射文件」 使用下面的代碼例外:

//bootstrap.php 
$config = Setup::createYAMLMetadataConfiguration(array(__DIR__ . 
"/../config/dcm"), $isDevMode); 

使用的Symfony YAML 2 *,一切運行良好。但是對於Symfony Yaml^3.3,我會得到無效的映射文件異常。我將其追溯到不同的Yaml庫解析函數如何工作。當使用學說解析YAML文件,它會用它加載使用此功能YAML文件YamlDriver類:

// vendor/doctrine/orm/lib/Doctrine/Orm/Mapping/Driver/YamlDriver.php 
protected function loadMappingFile($file) 
{ 
    return Yaml::parse($file); 
} 

在YAML 2 *,通過文件名的字符串解析沒有問題的作品,但與YAML^3.3 ,解析函數需要一個yaml字符串。一些方法來解決這個問題包括:使用XML配置文件或寫你自己的YAML驅動程序,繞過設置:: createYAMLMetadataConfiguration獲得的配置,並使用此代碼:

$config = self::createConfiguration($isDevMode, $proxyDir, $cache); 
$config->setMetadataDriverImpl(new \MyNamespace\YamlDriver($paths)); 

return $config;