2015-04-03 15 views
5

Tôi có một cơ sở dữ liệu rất đơn giản mà tôi đang cố gắng nhập và tạo các thực thể từ đó. Doctrine (Symfony) có thể tạo các tệp ánh xạ YML từ cơ sở dữ liệu. Nhưng khi tôi cố gắng tạo ra các thực thể, tôi nhận được lỗi sau:Symfony2/Doctrine2 Tệp ánh xạ không hợp lệ Ngoại lệ khi cố gắng tạo các đối tượng

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

Tệp yml có vẻ ổn với tôi, như chúng ta mong đợi là nó được tạo bởi Doctrine. Chỉ cần chắc chắn, tôi đã kiểm tra nó với trình xác thực yml trực tuyến cho biết điều đó là OK. Lệnh tôi đã sử dụng để cố gắng tạo các thực thể là:

app/console generate:doctrine:entities sandbox 

Các tệp .yml theo sau. Vui lòng giải thích bất kỳ lỗi khoảng cách yml nào là kết quả của việc dán tệp tại đây. Như tôi đã nói, các tệp yml được tạo bởi học thuyết và đã vượt qua xác minh trực tuyến.

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: { } 

Và để hoàn chỉnh, đây là tệp Danh mục yml. Lỗi trên Sản phẩm, nhưng tôi cho rằng đó là do Sản phẩm đã được xử lý trước.

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: { } 

Tôi đã tìm kiếm trên web bất kỳ tài nguyên nào liên quan đến chẩn đoán Ngoại lệ ánh xạ, nhưng chưa tìm thấy bất kỳ tài liệu nào. Tôi đoán rằng có một cái gì đó trong các tập tin YML đó là gây ra các máy phát thực thể để choke. Nhưng thông báo lỗi không đưa ra dấu hiệu nào về những gì có thể xảy ra. Tôi thấy có rất nhiều trường hợp loại câu hỏi này trên Stack Overflow. Nó sẽ là tuyệt vời để có được thông tin về CÁCH để chẩn đoán các loại lỗi, và do đó có thể tìm ra cho chính mình.

+0

Đồn, nó không phải là một giải pháp, nhưng bạn làm có một tùy chọn để chạy lệnh 'generate entity' của bạn với tùy chọn 'verbose'. Điều này sẽ cung cấp cho bạn một bãi chứa PHP stack, và sau đó bạn có thể bắt đầu đào sâu vào mã Doctrine, ít nhất để xem những gì đang thất bại. tuy nhiên, gợi ý rằng nếu bạn định bắt đầu poking xung quanh trong mã của nhà cung cấp, hãy thêm các câu lệnh chẩn đoán 'print_', và tương tự, bạn làm điều đó trong một cá thể kiểm thử của Symfony mà bạn tạo riêng cho mục đích này. –

Trả lời

10

đã được mô tả trong doc:

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

Vì vậy, cố gắng thay đổi định nghĩa yaml sản phẩm như sau:

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

Làm tương tự trong các tập tin bản đồ khác.

Hy vọng điều này giúp đỡ

+0

Không, ngay cả khi tôi đã thêm tên đủ điều kiện, vẫn gặp lỗi tương tự như tôi đã nói, các tệp YML này được tạo bởi Doctrine. Nhưng cảm ơn vì nỗ lực này. –

0

Sử dụng

php ứng dụng/console doctrine: generate: thực thể

để tạo ra một thực thể tự động bởi học thuyết. Bạn đã sử dụng

app/console doctrine: generate: thực thể Tên pháp nhân

Ý tôi là

app/console generate: doctrine: thực thể Tên pháp nhân

(chú ý "thực thể" số nhiều từ) của bạn lệnh là tạo thuộc tính được cập nhật của một thực thể hiện có và để tạo ra các phương thức getter và setter của mình nhưng không tạo ra một thực thể.

Đề nghị của tôi là:

  1. Xóa thực thể hiện
  2. Tạo cho họ một lần nữa sử dụng lệnh thích hợp.
2

Cố gắng đổi tên tập tin

SandboxBundle.Entity.Product.orm.yml 

để

Product.orm.yml 

và đảm bảo đủ điều kiện đầy đủ tên của bạn trong yaml

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

bạn có thể nhận được một lỗi vì của không gian tên đôi. Symfony thêm phần chấm của tập tin vào vùng tên.

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

Chúc may mắn :)

+0

ngay trên cue !!!! –

0

Gần đây tôi đã trải qua tương tự "MappingException: không hợp lệ tập tin bản đồ" ngoại lệ sử dụng đoạn mã sau:

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

Sử dụng Symfony YAML 2. *, tất cả mọi thứ đã làm việc tốt . Nhưng với Symfony Yaml^3.3, tôi sẽ nhận được ngoại lệ tệp ánh xạ không hợp lệ. Tôi đã truy tìm nó về cách hoạt động của các hàm phân tích cú pháp thư viện Yaml khác nhau. Khi sử dụng Học thuyết để phân tích file YAML, nó sẽ sử dụng lớp YamlDriver mà tải file YAML sử dụng chức năng này:

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

Trong YAML 2. *, đi qua một chuỗi tên tập tin để phân tích tác phẩm mà không vấn đề, nhưng với YAML^3.3 , hàm phân tích cú pháp mong đợi chuỗi yaml. Một số cách để làm được việc này bao gồm sử dụng các file xml cấu hình hoặc viết tài xế YAML của riêng bạn và thu thập các cấu hình bằng cách bỏ qua Setup :: createYAMLMetadataConfiguration và sử dụng mã này:

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

return $config; 
Các vấn đề liên quan