Symfony-实体和表单类型中的组序列定义的部分

时间:2019-03-18 23:26:37

标签: symfony validation entity

好像有些东西我听不懂。这将是一篇很长的文章,所以我会尽量简洁。

我尝试在Symfony 4.2中使用GroupSequence,但是我遇到了一个问题。我要实现的目标是添加一个未映射的字段并在FormType中定义GroupSequence(因为我想在此实体上使用另一个没有此未映射字段的FormType)。我希望在表单上的其他约束之前检查此未映射的字段“已验证”。

问题是在这种特殊情况下,我无法使用“组序列”来启用部分验证。

示例代码:https://github.com/sarramegnag/groupsequence-issue

这是我的实体代码:

<?php // src/Entity/Product.php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
 */
class Product
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     * 
     * @Assert\NotBlank()
     */
    private $name;

    /**
     * @ORM\Column(type="text")
     * 
     * @Assert\NotBlank()
     */
    private $description;

    /**
     * @ORM\Column(type="integer")
     * 
     * @Assert\NotBlank()
     */
    private $price;

    ...

我的表单类型代码:

<?php // src/Form/ProductType.php

namespace App\Form;

use App\Entity\Product;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\GroupSequence;
use Symfony\Component\Validator\Constraints\NotBlank;

class ProductType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('description')
            ->add('price')
            ->add('verified', CheckboxType::class, [
                'mapped' => false,
                'constraints' => [
                    new NotBlank(['groups' => ['Strict']]),
                ]
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Product::class,
            'validation_groups' => new GroupSequence(['Strict', 'Product']),
        ]);
    }
}

如果我在实体中设置属性和断言并将其映射为普通字段,它将起作用。

// src/Entity/Product.php

/**
 * @Assert\NotBlank(groups={"Strict"})
 */
private $verified = false;

...

public function isVerified(): ?bool
{
    return $this->verified;
}

public function setVerified(bool $verified): self
{
    $this->verified = $verified;

    return $this;
}

// src/Form/ProductType.php

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name')
        ->add('description')
        ->add('price')
        ->add('verified', CheckboxType::class)
    ;
}

事实上,只要我在实体中的断言上设置一个组,它就会起作用。

感谢您的时间,如果我不太清楚,请告诉我。

纪尧姆

0 个答案:

没有答案