2017-07-07 9 views
1

私はFilterとFilterCollectionオブジェクトを持っています。 FilterCollectionは、名前が示すように、フィルタのコレクションを保持します。 これですべてを検証する必要があるので、FilterTypeとFilterTypeCollectionフォームを作成しました。 FilterCollectionTypeでは私が持っている:Symfony3埋め込みフォームの検証が機能しない

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('filters', CollectionType::class, array(
      'entry_type' => FilterType::class 
     )); 
} 

そしてFilterCollection定義で私は、次のしている:

/** 
* @var array 
* @Assert\Valid() 
*/ 
private $filters = []; 

私はFilterCollectionのものに私の要求から要素を変換することができるように、私はparamConverterを作成しました。適用法では私が使用して、すべてを検証しよう:私は検証がFilterCollectionだけでなく、フィルタを検証するだけでなく、期待していた

public function apply(Request $request, ParamConverter $configuration) 

    $filterCollection = new FilterCollection(); 

    $form = $this->formFactory->create(
     FilterTypeCollection::class, 
     $filterCollection 
    ); 

    $form->submit($request->query->all()); 

    if ($form->isSubmitted() && $form->isValid()) { 
     $request->attributes->set($configuration->getName(), $filterCollection); 

     return true; 
    } else { 
     throw new FormValidationException($form); 
    } 

} 

。しかし、私がフィルタ定義で持っているバリデーションはうまくいかず、たとえバリデーションが失敗しても、それでもパスします。私はバリデータがFilter要素を渡していないと思います。

何が起こっているのでしょうか?

+0

あなたのコードに何が問題なのかよく分かりませんが、おそらくhttps://symfony.com/doc/current/reference/constraints/Collection.htmlをご覧ください。 –

+0

私は試しましたそれを地元で働かせることはできません。 FilterFormのフィールドに手動で制約を追加することができます。例: $ builder-> add( 'age'、TextType :: class、[ 'constraints' => array新しいRegex(['pattern' => '/ [0-9] + /'])))、 ]); –

答えて

1

私はついにそれを働かせました。おそらく、私と同じ間違いをして、"data_class"をformTypeのconfigureOptionsに追加するのを忘れたのかもしれません。

とにかく、ここで(生鮮のSymfony 3.3のインストールに)動作するコードだ

DefaultController.php

<?php 

namespace AppBundle\Controller; 

use AppBundle\Entity\Filter; 
use AppBundle\Entity\FilterCollection; 
use AppBundle\Form\FilterCollectionType; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 

class DefaultController extends Controller 
{ 
    /** 
    * @Route("/", name="homepage") 
    */ 
    public function indexAction(Request $request) 
    { 
     // add first filter, so we don't have to implement the collection javascript etc to test quickly 
     $collection = new FilterCollection(); 
     $collection->filters[] = new Filter(); 

     $form = $this->createForm(FilterCollectionType::class, $collection); 
     $form->handleRequest($request); 

     if ($form->isSubmitted()) { 
      if ($form->isValid()) { 
       echo "valid input"; // we don't want to see this ;) 
      } 
     } 

     // replace this example code with whatever you need 
     return $this->render('default/index.html.twig', [ 
      'form' => $form->createView() 
     ]); 
    } 
} 

Filter.php

<?php 

namespace AppBundle\Entity; 

use Symfony\Component\Validator\Constraints as Assert; 

class Filter { 
    /** 
    * @var string 
    * @Assert\NotBlank() 
    * @Assert\Regex(pattern="/[0-9]+/") 
    */ 
    public $name; 
} 

FilterCollection.php

<?php 

namespace AppBundle\Entity; 

use Symfony\Component\Validator\Constraints as Assert; 

class FilterCollection { 
    /** 
    * @var Filter[] 
    * @Assert\Valid() 
    */ 
    public $filters = []; 
} 

FilterType.php

<?php 

namespace AppBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class FilterType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('name', TextType::class); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'data_class' => 'AppBundle\Entity\Filter' 
     ]); 
    } 
} 

FilterCollectionType

<?php 

namespace AppBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\Extension\Core\Type\CollectionType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class FilterCollectionType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('filters', CollectionType::class, [ 
      'entry_type' => FilterType::class, 
     ]); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'data_class' => 'AppBundle\Entity\FilterCollection', 
     ]); 
    } 

    public function getName() 
    { 
     return 'app_bundle_filter_collection_type'; 
    } 
} 

注:あなたがやったように私はParamConverterをしなかったが、それは質問のポイントの横にいるようです。 ParamConverterを簡単に使用できるようにコードを変更することができます。

関連する問題