2012-08-26 14 views
12

Tôi có một mẫu với 3 lớp: lớp Đầu tiên là các container cho các trò chơi:Cascade Validation không làm việc trên lớp thứ ba của một hình thức

class GameListType extends AbstractType { 

    public function buildForm(FormBuilderInterface $builder, array $options) { 
     $builder->add('games', 'collection', array(
      'required' => false, 
      'allow_add' => true, 
      'prototype' => true, 
      'by_reference' => false, 
      'type' => new GameBetType(), 
     )) 
     ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) { 
     parent::setDefaultOptions($resolver); 
     $resolver->setDefaults(array(
      'cascade_validation' => true, 
     )); 
    } 
} 

Thứ hai lớp là trò chơi chính nó, kể từ khi tôi làm không có ý định thay đổi cuộc chơi, nhưng đặt cược vào nó, nó chỉ bao gồm các hình thức cho đặt cược:

class GameBetType extends AbstractType { 

    public function buildForm(FormBuilderInterface $builder, array $options) { 
     $builder->add('bet', new BetType()); 
    } 

    public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver) { 
     parent::setDefaultOptions($resolver); 
     $resolver->setDefaults(array(
      'data_class' => 'Strego\TippBundle\Entity\Game', 
      'cascade_validation' => true, 
     )); 
    } 
} 

Và lớp thứ ba là hình thức cho đặt cược:

class BetType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 

     $builder->add('scoreT1' , 'text') 
       ->add('scoreT2' , 'text'); 
     ; 
    } 


     public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver) { 
     parent::setDefaultOptions($resolver); 
     $resolver->setDefaults(array(
      'data_class' => 'Strego\TippBundle\Entity\Bet', 
     )); 
    } 

} 
.210

Vấn đề là, rằng nếu có trở ngại xác nhận vào mức độ thứ ba, hình thức gốc luôn là hợp lệ, nhưng nếu tôi đặc biệt xác nhận các tổ chức cá cược, tôi nhận được danh sách vi phạm đúng trong điều khiển của tôi:

// Form processing 
$form = $this->createForm(new GameListType(), $entity); 
$request = $this->getRequest(); 

if ($request->getMethod() == 'POST') { 
    $form->bind($request); 
    $entity = $form->getData(); 

    if ($form->isValid()) { 
     foreach ($entity->getGames() as $game) {     
      if($game->hasBet()){ 
       $bet = $game->getBet(); 
       $bet->setUser($user); 
       $validator = $this->container->get('validator'); 
       $errors = $validator->validate($bet); 
       var_dump($errors) //<-- i see there are errors 
       if(count($errors) == 0){ 
        print($bet. ' gets persisted<br>'); 
        $em->persist($bet); 
       } 
      }    
     } 
    $em->flush(); 
    } 
} 

Một vấn đề khác là ngay cả khi tôi không gọi $em->persist($bet) các thực thể vẫn tiếp tục tồn tại. Tôi không thấy kết quả được mô tả trong dòng

print($bet.'gets persisted<br>'); 

nhưng đầu vào biểu mẫu vẫn tiếp tục tồn tại trong cơ sở dữ liệu.

Vì vậy, hai câu hỏi của tôi:

  1. Làm thế nào để tôi nhận được lỗi nếu xác nhận thất bại trên đặt cược không hình thức (tôi không muốn toàn bộ hình thức là không hợp lệ, vì không chỉ có thể 1 trong số 3 cược không hợp lệ).

  2. Tại sao đặt cược vẫn tiếp tục ngay cả khi tôi không gọi $em-persist($bet), đây có phải là một số phép thuật xảy ra với sự ràng buộc không?

+0

lòng cũng cung cấp các AbstractType lớp – Vineet1982

+0

của nó symfony2 mặc định AbstractType: https://github.com/symfony/symfony/blob/master/src /Symfony/Component/Form/AbstractType.php – m0c

Trả lời

3

Để trả lời câu hỏi thứ hai của bạn, bạn có thể đã tuyên bố hai chiều OneToMany mối quan hệ giữa UserBet tổ chức và thiết lập cascade={"persist"} trên User bên của mối quan hệ. Vì vậy, trình quản lý đối tượng sẽ tự động đánh dấu các đối tượng thực thể Bet để chèn/cập nhật trong hoạt động flush tiếp theo. Ngoài ra, hãy di chuyển $em->flush(); dòng ra khỏi vòng lặp. Theo phương thức flush truy vấn db, nó kết nối với db mỗi mã thời gian đi vào vòng lặp. Trong khi nếu $em->flush(); nằm ngoài vòng lặp thì thực thể sẽ truy vấn một lần với tất cả sql đã thay đổi được bao trong một giao dịch duy nhất.

+0

Tôi có mối quan hệ hai chiều, nhưng không phải cascade = {persist] ở cả hai bên. Các tuôn ra là bên ngoài vòng lặp, có lẽ tôi sao chép nó sai. – m0c

0

Tôi chắc chắn bạn nên duy trì thực thể game chứ không phải là bet.

Để kiểm tra xác thực nếu có một số thiết lập nhóm xác thực, đó có thể là lý do tại sao nó không xác thực chính xác.

+0

Trong biểu mẫu này, chỉ các cược được gửi, các trò chơi đã tồn tại trước và không thay đổi.Và không có nhóm xác nhận. – m0c

1

Bạn chỉ cần quên để thêm cascade_validation với trò chơi collection loại

$builder->add('games', 'collection', array(
    'required' => false, 
    'allow_add' => true, 
    'prototype' => true, 
    'by_reference' => false, 
    'type' => new GameBetType(), 
    'cascade_validation' => true 
)); 
Các vấn đề liên quan