回调约束不显示paylod(Symfony Validator组件)

时间:2016-03-14 19:28:01

标签: symfony symfony-validator

我的控制器代码:

public function postFilesAction(Request $request)
{
    $validator = $this->get('validator');
    $requestCredentials = RequestCredentials::fromRequest($request);
    $errors = $validator->validate($requestCredentials);

...

验证RequestCredentials中的方法(回调约束)。

/**
 * @Assert\Callback(payload = {"errorCode" = "FILE_FILE_URL"})
 */
public function validate(ExecutionContextInterface $context)
{
    if (! ($this->fileExistsAndValid() || $this->fileUrlExistsAndValid())) {
        $context->buildViolation('Neither file nor file_url is present.')->addViolation();
    }
}

回调按预期工作,但$constraintViolation->$constraint->$payload的值为空。

当我尝试在其他Constraints(例如NotBlank)中使用有效负载时,它可以工作(我可以在ConstraintViolation对象中看到它。)

是Symfony的错误还是我做错了什么?我应该使用其他解决方案解决我的问题吗? (我需要检查请求中是否存在两个字段(filefile_url)中的至少一个。

2 个答案:

答案 0 :(得分:2)

在使用Callback约束时,在Symfony 3.0中无法轻松访问回调中的有效内容。从Symfony 3.1开始,有效负载将作为附加参数传递给回调(请参阅https://github.com/symfony/symfony/issues/15092https://github.com/symfony/symfony/pull/16909)。

答案 1 :(得分:2)

我设法用断言中的以下代码来解决这个问题:

/**
 * @Assert\Callback(payload = {"error_code" = "1"}, callback = "validate", groups = {"Default", "RequestCredentials"})
 */
public function validate(ExecutionContextInterface $context)
{
    // some validation code
}

我认为这个问题是因为Symfony Callback constraint构造函数:

public function __construct($options = null)
{
    // Invocation through annotations with an array parameter only
    if (is_array($options) && 1 === count($options) && isset($options['value'])) {
        $options = $options['value'];
    }
    if (is_array($options) && !isset($options['callback']) && !isset($options['groups'])) {
        $options = array('callback' => $options);
    }
    parent::__construct($options);
}

如果给出$options = ['payload' => [...]](在我的情况下发生了什么),它会将其变为$options = ['callback' => ['payload' => [...]]] 然后'{payload}数据在ConstraintViolation对象中变得无法使用。

但是我仍然不确定它是否是Symfony不完美还是我没有得到某些东西并且使用它错了。