已创建一项API,允许创建带有描述和任意数量附加照片的帖子。
问题在于,当接收到编辑帖子的API请求时,如果描述为空,则类型提示会失败。
class Post {
/**
* @Assert\NotBlank
* @ORM\Column(type="text")
*/
private $description;
/**
* @ORM\ManyToMany(targetEntity="App\Entity\Photo")
*/
private $photos;
public function setDescription(string $descripton)
这意味着,与其Symfony验证失败的Assert\NotBlank返回500,不如允许在方法?string中使用空值,这将允许调用验证,但会导致实体变得脏乱。
采用数据传输对象(DTO)方法,创建一个新类来表示数据,并将验证规则应用于此类,然后将其添加到表单中。
class PostData {
/**
* @Assert\NotBlank
*/
public $description;
/**
* @Assert\Valid
* @var Photo[]
*/
public $photos;
表单已被修改:
class PostType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
$builder
->add('description')
->add('photos', EntityType::class, [
'class' => Photo::class,
'multiple' => true,
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => PostData::class,
));
}
这对于描述有效,可以在不更改Post实体的情况下进行验证。如果接收到null,则PostData将触发Assert\NotBlank,而Post::setDescription将不会使用null被调用。
问题出在尝试验证照片是否存在时,如果照片存在,则可以正常工作,如果不存在,则会出现500错误。
这可能是一个没有指示原因的无意义的500错误。
Checking only for cacheable HTTP methods with Symfony\Component\HttpFoundation\Request::isMethodSafe() is not supported. (500 Internal Server Error)
我该如何使用DTO PostData来验证相片实体是否存在?