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

3

已创建一项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来验证相片实体是否存在?
1个回答

0
更新composer.json文件并运行composer update命令。
       "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。

我不建议在生产环境中运行此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接