1

我的控制器代码:

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

...

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

/**
 * @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->$payloadnull。

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

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

4

2 回答 2

2

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

于 2016-03-16T13:23:40.583 回答
2

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

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

我认为问题是因为Symfony Callback 约束构造函数:

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 的缺陷还是我没有得到某些东西并且使用错误。

于 2016-03-21T19:52:05.717 回答