【发布时间】:2021-06-14 06:52:32
【问题描述】:
我目前对 Symfony 验证器服务的工作方式感到困惑。按照我目前的理解,如果在设置值时发生 TypeError,它甚至可能在验证实体之前完全失败并且不会报告错误。
Symfony 文档在这样的实体中使用约束:
namespace App\Entity;
// ...
use Symfony\Component\Validator\Constraints as Assert;
class Author
{
/**
* @Assert\NotBlank
*/
private $name;
}
然后在控制器中像这样使用:
public function author(ValidatorInterface $validator)
{
$author = new Author();
// ... do something to the $author object
$author->setBirthDate('this will fail and not report'); // I added this line in myself, see rest of question.
$errors = $validator->validate($author);
if (count($errors) > 0) {
/*
* Uses a __toString method on the $errors variable which is a
* ConstraintViolationList object. This gives us a nice string
* for debugging.
*/
$errorsString = (string) $errors;
return new Response($errorsString);
}
return new Response('The author is valid! Yes!');
}
但是,当错误类型的参数被传递给实体变量的设置器时,这不会很好地捕获将引发的异常。例如,实体可以有一个字段“birthDate”,它是一个 DateTime,并且有一个 setter setBirthDate(DateTime $foo)。在能够调用 validate() 函数之前构建对象时,可能会传递一个不正确类型的参数 - 例如,用户提交了一个字符串或根本没有提交 - 这显然会引发异常。
假设验证器服务应该这样使用,我的问题如下:如何干净地处理可能在设置器中引发 TypeErrors 的数据?
我是否没有在我的设置器中进行任何类型提示(接受所有内容),然后稍后使用验证器验证它是否为 DateTime?设置实体时是否使用 try/catch 块?在调用 setter 之前,我是否要手动检查用户输入的类型?如果最后两个中的任何一个,我将如何干净地向用户报告错误?即便如此,我认为也在你也在验证器服务中进行手动验证时感觉不对。
我了解 Forms,并且我认为在使用它们时这不是问题,但我仍然发现验证器无论哪种方式都令人困惑。
【问题讨论】:
标签: php symfony validation error-handling