首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony3嵌入式表单验证不起作用

Symfony3嵌入式表单验证不起作用
EN

Stack Overflow用户
提问于 2017-07-07 10:01:24
回答 1查看 598关注 0票数 1

我有一个过滤器和FilterCollection对象。FilterCollection保存一组过滤器,就像名称所指示的那样。现在我需要验证所有内容,所以我创建了一个FilterType和FilterTypeCollection表单。在FilterCollectionType中有:

代码语言:javascript
复制
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('filters', CollectionType::class, array(
            'entry_type' => FilterType::class
        ));
}

在FilterCollection定义中,我有以下内容:

代码语言:javascript
复制
/**
 * @var array
 * @Assert\Valid()
 */
private $filters = [];

我创建了一个paramConverter,以便将请求中的元素转换为FilterCollection元素。在apply方法中,我尝试使用以下方法验证所有内容:

代码语言:javascript
复制
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);
    }

}

我原以为验证不仅会验证FilterCollection,而且还会验证过滤器。但是我在过滤器定义中的验证是不起作用的,即使我的验证应该失败,它仍然会通过。我认为验证器没有传递过滤器元素。

知道会发生什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-10 08:58:40

我终于让它开始工作了。也许您和我犯了同样的错误,忘记在configureOptions中添加formType。

无论如何,下面是工作的代码(在Symfony 3.3的新安装上)

DefaultController.php

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?php

namespace AppBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert;

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

FilterType.php

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44968006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档