2013-03-21 34 views
13

Tôi gặp sự cố khi ghi đè thực thể. Tôi cần trường emailCanonical để không phải là duy nhất.Symfony2 FOSUserBundle Ghi đè trường đối tượng người dùng

Đây là những gì tôi đã thực hiện: Trong tôi UserBundle\Resources\config\doctrine\User.orm.xml Tôi đã thêm các cấu hình attribute-overrides sau, theo các tài liệu Doctrine2

<attribute-overrides> 
    <attribute-override name="emailCanonical"> 
     <field column="email_canonical" unique="false" name="emailCanonical" /> 
    </attribute-override> 
</attribute-overrides> 

Sau đó, tôi chạy giao diện điều khiển sau lệnh

$ php app/console doctrine:migrations:diff 
$ php app/console doctrine:migrations:migrate 

Mọi thứ hoạt động tốt. emailCanonical được tạo thành không độc đáo. Nhưng bây giờ, khi tôi cần phải tạo ra một thực thể trong bó khác của dự án, tôi có một lỗi lạ:

$ php app/console doctrine:generate:entities SkyModelsBundle:Category 
Generating entity "Sky\Bundle\ModelsBundle\Entity\Category" 

[Doctrine\ORM\Mapping\MappingException] 
Invalid field override named 'emailCanonical' for class 'Sky\Bundle\UserBundle\Entity\User'. 

doctrine:generate:entities [--path="..."] [--no-backup] name 

Tuy nhiên, nếu tôi loại bỏ các thiết lập ghi đè từ mapping xml, mọi thứ đều hoạt động tốt.

+0

tôi không chắc chắn, câu hỏi của bạn là gì. –

+0

Đây là cách tôi giải quyết nó .. bạn có thể thử điều này: http://stackoverflow.com/a/17059918/2342137 – Tim

+0

Tôi có cùng một vấn đề. Tôi đã sử dụng chú thích để ghi đè lên cùng thuộc tính và không nhận ra có sự cố cho đến khi tôi thử sử dụng doctrine: generate: entity. Bạn đã bao giờ tìm thấy một giải pháp? – d0001

Trả lời

2

Tôi tin rằng name thuộc tính của thẻ field là không cần thiết, vì nó đã được xác định cho thẻ attribute-override

Hãy thử điều này

<attribute-overrides> 
    <attribute-override name="emailCanonical"> 
     <field column="email_canonical" unique="false" /> 
    </attribute-override> 
</attribute-overrides> 
1

Dường như các đơn vị FOSUserBundle không được nhập một cách chính xác vào dự án của bạn. Hãy chắc chắn rằng FOSUserBundle có mặt trong "ánh xạ" phần ("học thuyết" chi nhánh) của config.yml bạn

doctrine: 
    orm: 
     entity_managers: 
      default: 
       connection:  default 
       mappings: 
        AcmeDemoBundle: ~ 
        FOSUserBundle: ~ 
3

Trích từ chính thức documentation, vì vậy có thể là cách duy nhất của nó.

If you need to change the mapping (for instance to adapt the field names to a legacy database), the only solution is to write the whole mapping again without inheriting the mapping from the mapped superclass.

+0

oh god o.O ..... – Kuro

+6

Nó cũng nói "Một giải pháp khác có thể thông qua thuộc tính doctrine và quan hệ ghi đè" – httpete

+0

Không đúng như vậy kể từ tháng 6 năm 2013. bạn chỉ có thể ghi đè ánh xạ và vẫn kế thừa từ BaseUser. Như tôi Phác thảo ở đây: http://stackoverflow.com/questions/22718628/fosuserbundle-override-roles-property-roles-in-acme-demobundle-entity-user/24612877#24612877 – juanmf

0

Có lỗi tương tự ngay lúc này và tôi đã giải quyết nó. Doctrine ném Mappingexception này trong ClassMetadataInfo khi nó không thể tìm thấy thuộc tính liên quan (thuộc tính hoặc quan hệ) trong ánh xạ của nó.

Vì vậy, để ghi đè "emailCanonical" thuộc tính, bạn cần phải sử dụng "thuộc tính ghi đè" và "thuộc tính ghi đè" (như bạn đã làm), và xác định lại tài sản? Php class trong tổ chức của bạn:

<?php 
... 
class YourUser extends BaseUser 
{ 
    ... 
    /** 
    * Email canonical 
    * 
    * @var string 
    * 
    * @ORM\Column(name="email_canonical", type="string", length=255, unique=false) 
    */ 
    protected $emailCanonical; 

@EDIT: sử dụng giải pháp này khiến tôi bị lỗi khác.

Nó giải quyết một câu hỏi về "Ghi đè trường không hợp lệ có tên ...", nhưng tôi đã nhận một số khác với "Định nghĩa trùng lặp cột ..." khi cố gắng xác thực lược đồ bằng lệnh php app/console doctrine:schema:validate.

Bất kỳ ý tưởng nào?

+0

Bạn đã tìm thấy giải pháp chưa? – httpete

+0

Tôi không tìm thấy giải pháp nào khác ngoài giải thích ở trên:/Tôi luôn tìm kiếm giải pháp "sạch" cho các lỗi này – vince

0

lớp học của bạn kéo dài BaseUser nên như thế này:

<?php 
namespace Namespace\UserBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use FOS\UserBundle\Model\User as BaseUser; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 
/** 
* User 
* @ORM\Entity 
* @ORM\Table(name="user") 
* @UniqueEntity(fields="email", message="your costum error message") 
* 
*/ 
class myUser extends BaseUser 
{ 
    /** 
    * @ORM\Id() 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 
} 

?> 
10

Bạn ghi đè bằng các chú thích PHP như vậy (Điều này được hỗ trợ bắt đầu từ học thuyết phiên bản 2.3 trở lên, xin lưu ý rằng trong tài liệu nó đề cập rằng bạn không thể ghi đè các loại, tuy nhiên tôi đã có thể làm như vậy bằng cách sử dụng phiên bản mới nhất của học thuyết, tại thời điểm viết nó là 2.4.4):

<?php 
namespace Namespace\UserBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use FOS\UserBundle\Model\User as BaseUser; 

/** 
* User 
* @ORM\Entity 
* @ORM\AttributeOverrides({ 
*  @ORM\AttributeOverride(name="id", 
*   [email protected]\Column(
*    name  = "guest_id", 
*    type  = "integer", 
*    length = 140 
*   ) 
*  ) 
* }) 
*/ 
class myUser extends BaseUser 
{ 
    /** 
    * @ORM\Id() 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 
} 

này được quy định trong tài liệu hướng dẫn tại địa chỉ: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html#overrides

+1

Đây là câu trả lời đúng cho tôi. – Hast

0

Tôi biết đây là một bài cũ, nhưng tôi tìm thấy một giải pháp, ít nhất nó làm việc cho tôi, có lẽ nó sẽ rất hữu ích cho một người nào khác.

Vâng, tôi đã có cùng một vấn đề và tôi đang sử dụng trình quản lý tùy chỉnh cho fos_user, trong tệp khai báo config.yml trong doctrine entity_manager custom manager tôi đã khai báo ánh xạ tới FOS_userBundle, NHƯNG những gì còn thiếu là báo cho FOS_user mà chúng tôi sử dụng một người quản lý khác nhau và đó là bằng cách thêm:

fos_user:
---- db_driver: ORM
---- model_manager_name: MyCustom_Manager

Các vấn đề liên quan