2012-05-02 32 views
12

Tôi có một biểu mẫu để tạo một thực thể mới. Thực thể đó có một tập hợp các thực thể khác cũng được nhập vào biểu mẫu đó.Symfony2 + Doctrine - Xác thực một bộ sưu tập các thực thể

Tôi muốn sử dụng các tùy chọn xác thực của thực thể trong bộ sưu tập để xác thực các thực thể đó nhưng nó không hoạt động. Các quy tắc xác thực của thực thể "chính" (Người) được chọn, nhưng các quy tắc xác nhận của các thực thể trong bộ sưu tập addressList (Địa chỉ) không được chọn. Khi tôi nhập thông tin không hợp lệ vào các trường, biểu mẫu đã gửi được xác thực thành công.

Trong ví dụ này, chú thích cho đường phố không được sử dụng để xác thực.

class Person 
{ 
    ... 

    /** 
    * @ORM\OneToMany(targetEntity="Address", mappedBy="owner", cascade={"persist", "detach"}) 
    */ 
    protected $addressList; 

    .... 
} 

class Address 
{ 
    ... 
    /** 
    * @ORM\ManyToOne(targetEntity="Person", inversedBy="addressList") 
    * @ORM\JoinColumn(name="person_id", referencedColumnName="id", onDelete="CASCADE") 
    */ 
    protected $owner; 

    /** 
    * @ORM\Column(type="string", length=75) 
    * @Assert\MinLength(
    *  limit=3, 
    *  message="Street must have atleast {{ limit }} characters." 
    *) 
    */ 
    protected $street; 

    ... 

} 

Tôi có thể lấy biểu mẫu để xác thực các thực thể Địa chỉ được cung cấp như thế nào?

+2

tôi cố định này bằng cách thêm ' 'cascade_validation' => true' đến các mảng của' getDefaultOptions() 'của PersonType. – Bramklg

Trả lời

0

Bạn cũng có thể sử dụng "Valid" hạn chế với "All" hạn chế:

/** 
* @ORM\OneToMany(targetEntity="Address", mappedBy="owner", cascade={"persist", "detach"}) 
* @Assert\All({ 
*  @Assert\Valid 
* }) 
*/ 

protected $addressList; 
+1

Bạn có chắc chắn không? Điều này mang lại cho tôi "Các ràng buộc hợp lệ không thể được lồng bên trong ràng buộc Symfony \ Component \ Validator \ Constraints \ Tất cả. Bạn chỉ có thể khai báo ràng buộc hợp lệ trực tiếp trên một lĩnh vực hoặc phương pháp." trong 2.1 – nurikabe

+0

Không chắc chắn nữa. Tôi nghĩ rằng tôi đã sử dụng 2,0 tại thời điểm đó và tôi đã phải đối phó với một vấn đề tương tự. Nếu nó không hoạt động có lẽ tôi nên loại bỏ câu trả lời của tôi. – Julien

+2

Tính năng này không hoạt động nữa với độ phân giải 2.6+. – tftd

13

tôi đã cùng một vấn đề nhưng đã được giải quyết với:

/** 
* @ORM\OneToMany(
* targetEntity="Entity", 
* mappedBy="mappedEntity", 
* cascade={"persist" , "remove"} 
*) 
* @Assert\Valid 
*/ 
+0

Điều này sẽ xác thực rằng mỗi địa chỉ từ danh sách chỉ là thực thể Địa chỉ hợp lệ. Nhưng nếu bạn muốn một số xác nhận hợp lệ hơn nhìn vào câu trả lời @ sergey-polischook từ bên dưới – Jekis

7

tôi sử dụng này:

use Symfony\Component\Validator\ExecutionContextInterface; 

class Person 
{ 
... 

/** 
* @ORM\OneToMany(targetEntity="Address", mappedBy="owner", cascade={"persist", "detach"}) 
*/ 
protected $addressList; 

.... 

/** 
* @Assert\Callback 
*/ 
public function validate(ExecutionContextInterface $context) 
{ 
    if (!$this->getAddressList()->count()) { 
     $context->addViolationAt(
      'addressList', 
      'You must add at least one address', 
      array(), 
      null 
     ); 
    } 
} 
} 

http://symfony.com/doc/current/reference/constraints/Callback.html

+0

Cũng thêm @Assert \ Valid vào $ addressList và nó sẽ là giải pháp hoàn chỉnh – Jekis

4

Chỉ cần thêm chú thích khẳng định như sau

/** 
* @Assert\Count(
*  min = "1", 
*  minMessage = "You must specify at least one" 
*) 
* @Assert\Valid 
* 
*/ 
protected $name_of_collection_property; 
Các vấn đề liên quan