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 很多额外信息。
我不建议运行在生产中使用它。
已创建 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 很多额外信息。
我不建议运行在生产中使用它。