【问题标题】:How to call Assert Callback method only if all constraints are satisfied?仅当满足所有约束时,如何调用 Assert Callback 方法?
【发布时间】:2013-11-14 10:15:35
【问题描述】:

我有一个带有断言回调方法“processSignup”的实体帐户。仅当登录约束和密码约束成功时,我才想调用“processSignup”。请问如何在我的 processSignup 方法中检查这个?

<?php
namespace MyProject\Bundle\FrontBundle\Entity;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Validator\ExecutionContext;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @Assert\Callback(methods={"processSignup"})
 */
class Account
{

    /**
     * @Assert\NotBlank()
     * @Assert\Type(type="string")
     * @Assert\Length(min = 6, max = 16)
     */
    protected $login;

    /**
     * @Assert\NotBlank()
     * @Assert\Type(type="string")
     * @Assert\Length(min = 8, max = 12)
     */
    protected $password;

    /**
     * @param ExecutionContext $context
     */
    public function processSignup(ExecutionContext $context)
    {
        // if login and password constraints success, do something
    }

    public function getLogin()
    {
        return $this->login;
    }

    public function setLogin($login)
    {
        $this->login = $login;
    }

    public function getPassword()
    {
        return $this->password;
    }

    public function setPassword($password)
    {
        $this->password = $password;
    }
}

【问题讨论】:

  • 试试$context-&gt;getViolations()。它返回到目前为止的所有违规行为
  • 我试过了,但是当约束不满足时,它返回一个空数组。
  • 你是对的,但我认为这是检查约束是否成功的唯一方法。尝试触发用户名和密码约束并检查数组是否为空。您可以使用 var_dump 和 die 的 Xdebug 来做到这一点 :)

标签: symfony callback symfony-2.1 validation


【解决方案1】:

在同样的情况下,我使用了验证组:

/** @Assert\Callback(methods={"processSignup"}, groups={"LastValidation"}) */
class Account {
    /**
     * @Assert\NotBlank()
     * @Assert\Type(type="string")
     * @Assert\Length(min = 6, max = 16)
     */
    protected $login;
....
}

在 FormType 中:

class AccountType extends AbstractType {
   public function buildForm(FormBuilderInterface $builder, array $options)
   {
       ....
   }

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    parent::setDefaultOptions($resolver);
    $resolver->setDefaults(
            [
            ....
            'validation_groups' => function (FormInterface $form)
                    {
                        return ['Account', 'LastValidation'];
                        // The first element's value must be the same as data-class name
                    }
            ]
    );

}

然后在 processSignup 方法中你可以检查

    if(0 !== $context->getViolations()->count())
    {
        return;
    }

【讨论】:

    猜你喜欢
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    相关资源
    最近更新 更多