Symfony 4 表单、自定义 DTO 和实体关系

Symfony 4 forms, custom DTO and entity relationships

已创建 API 以允许创建带有说明和任意数量的附加照片的 Post。

问题是,当收到 API 编辑 Post 的请求时,其描述为空,类型提示将失败。

 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 来表示数据已创建,验证规则应用于此,然后将其添加到表单中。

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 Post数据将触发 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 Post数据来验证照片实体是否存在?

更新 composer.json 和 运行 作曲家更新

       "symfony/http-foundation": "4.4.*",

此问题与 https://github.com/symfony/symfony/issues/27339

有关

这将给出更有意义的 Symfony 表单错误

Unable to reverse value for property path \"photos\": Could not find all matching choices for the given values

如果您对包括 DATABASE_URL 和 APP_SECRET 在内的表单错误进行序列化,它还会 return 很多额外信息。

我不建议运行在生产中使用它。