我的控制器代码:
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的错误还是我做错了什么?我应该使用其他解决方案解决我的问题吗? (我需要检查请求中是否存在两个字段(file
或file_url
)中的至少一个。
答案 0 :(得分:2)
在使用Callback
约束时,在Symfony 3.0中无法轻松访问回调中的有效内容。从Symfony 3.1开始,有效负载将作为附加参数传递给回调(请参阅https://github.com/symfony/symfony/issues/15092和https://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不完美还是我没有得到某些东西并且使用它错了。