我创建了一个带有自定义控制器的实体:
// api/src/Entity/UserRegistration.php
namespace App\Entity;
use ...
/**
* UserRegistraion Data
*
* @ApiResource(collectionOperations={},itemOperations={"post"={
* "method"="POST",
* "path"="/register",
* "controller"=CreateUser::class}})
*
*/
class UserRegistration
{
.....
/**
* @var string The E-mail
*
* @Assert\NotBlank
* @Assert\Email(
* message = "The email '{{ value }}' is not a valid email.",
* checkMX = true
* )
*/
public $email;
.....
还有一个自定义控制器:
// api/src/Controller/CreateUser.php
class CreateUser
{
.....
public function __invoke(UserRegistration $data): UserRegistration
{
return $data;
}
}
当我用错误的数据(例如错误的电子邮件地址)呼叫控制器时,我会期望验证错误,但未选中该错误。
有没有办法做到这一点?
答案 0 :(得分:1)
最常见的方法是使用提供验证的表单,或者仅将Validator作为独立组件。在您的情况下-由于您正在使用ApiPlatform-后者将是更好的选择,因为您不需要将表单呈现回用户,而是返回错误响应。
首先,您需要将Validator注入您的Controller中:
use ApiPlatform\Core\Bridge\Symfony\Validator\Exception\ValidationException;
use Symfony\Component\Validator\Validator\ValidatorInterface;
class CreateUser
{
private $validator;
public function __construct(ValidatorInterface $validator)
{
$this->validator = $validator;
}
public function __invoke(UserRegistration $data): UserRegistration
{
$errors = $this->validator->validate($data);
if (count($errors) > 0) {
throw new ValidationException($errors);
}
return $data;
}
}
您还可以通过查看ValidateListener来检查ApiPlatform的工作方式。它提供了一些附加功能,例如对于验证组,您现在似乎不需要,但是以后可能会很有趣。然后,ApiPlatform将使用其ValidationExceptionListener对您抛出的异常做出反应并适当地呈现它。