【问题标题】:Symfony 2.3 cascade_validationSymfony 2.3 级联验证
【发布时间】:2014-08-17 15:01:20
【问题描述】:

我在 symfony 2.3 中构建了一个表单。其中显示并保存此配置文件的用户配置文件和地址。 我有两个实体。一个用户和一个地址实体。 (我只展示部分代码,这里代码不完整)

用户实体:

/**
 * @ORM\Entity
 * @ORM\Table(name="user")
 * @ORM\Entity(repositoryClass="Ebm\UserBundle\Entity\UserRepository")
 */
class User implements AdvancedUserInterface, \Serializable
{
      /**
      * @ORM\Column(type="integer")
      * @ORM\Id
      * @ORM\GeneratedValue(strategy="AUTO")
      */
     protected $id;


    /**
     * @ORM\Column(type="string", length=255)
     */
    protected $firstName;


    /**
     * @ORM\Column(type="string", length=255)
     */
    protected $lastName;

    /**
     * @ORM\Column(type="string", length=255, unique=true)
     */
    private $username;

    /**
     * @var \Doctrine\Common\Collections\Collection
     * @Assert\Valid
      * @ORM\ManyToMany(targetEntity="Ebm\UserBundle\Entity\Address", cascade={"persist",  "remove"})
     * @ORM\JoinTable(name="user_address",
     *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="address_id", referencedColumnName="id")}
     * )
     */
    protected $addresses;
    }

地址实体:

/**
 * @ORM\Entity
 * @ORM\Table(name="address")
 */
class Address
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    protected $street;
}

以及将地址实体作为集合嵌入到用户表单“usertype”中的表单。

用户类型:

class UserType extends AbstractType
{

    protected $securityContext;

    public function __construct(SecurityContext $securityContext)
    {
        $this->securityContext = $securityContext;
    }


    /**
     * (non-PHPdoc)
     * @see \Symfony\Component\Form\AbstractType::buildForm()
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->->add('addresses', 'collection', array(
                        'type' => new AddressType() ,
                        'allow_add' => true, 
                        'allow_delete' => true,
                        'label' => false,
                        'cascade_validation' => true)
                      ));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Ebm\UserBundle\Entity\User',
            'cascade_validation' => true,
    ));

}

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

}

在我的控制器中,验证部分如下所示:

    $form = $this->createForm($this->get('form.type.user'), $user)->add('save', 'submit');

    // On initial page load handleRequest() recognizes that the form was not submitted and does nothing
    // isValid returns false
    $form->handleRequest($request);

    // Check if form isValid
    if ($form->isValid()) {
    }

而我的验证 yml (UserBundle/config/validation.yml) 文件看起来像这样

Ebm\UserBundle\Entity\User:
    properties:
        firstName:
            - NotBlank: ~
            - Length:
                max: 255
        addresses:
            - Valid: ~

Ebm\UserBundle\Entity\Address:
    properties:
        street:
            - NotBlank: { message: "validate.not_blank" }
            - Type:
                  type: string
            - Length:
                  max: 255

如果地址字段是 emtyp "street" 作为示例,则不会发生错误。只有验证错误 显示实体“用户”。

我一周以来一直在寻找解决方案,如果有人可以帮助我,我将非常幸运

【问题讨论】:

  • 我认为验证是正确的,但它没有显示来自嵌入集合的错误消息?有没有人有想法?

标签: validation symfony


【解决方案1】:

从 >= Symfony 2.5 开始,您可以使用 getErrors 的 deep 参数

如果要显示复合表单的错误,请使用getErrors() 函数中的deep 参数:

// Check if form isValid
if ($form->isValid() === false) {
    echo $form->getErrors(true);
}

否则使用所有函数递归:

public function getErrorsRecursive($form) {
    $errors = array();

    foreach ($form->getErrors() as $error) {
        $errors[] = $error->getMessage();
    }        

    foreach ($form->all() as $fieldName => $formType) {
        if ($errorMessage = $this->getErrorsRecursive($formType)) {
            $errors[$fieldName] = array_pop($errorMessage);
        }
    }

    return $errors;
}

【讨论】:

    猜你喜欢
    • 2014-04-30
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    相关资源
    最近更新 更多