Symfony 4.* Setting field values in controller and prevent validatinon error: This value should not be null
Symfony 4.* Setting field values in controller and prevent validatinon error: This value should not be null
我正在使用 Symfony 4.2.3.
我有一个名为 Article
的实体,其中包含以下字段:
- 版本
- versionUserId
- 版本时间戳
其中有 * @Assert\NotNull
验证标记。
我想在控制器中手动设置这些字段的值,例如使用:
$article->setVersionUserId($user);
$article->setVersionTimestamp(new \DateTime());
$article->setVersion(1);
但是,据我了解 $form->isValid()
,验证对象而不是表单。因此,为了防止 This value should not be null.
验证错误 我必须在验证表单之前设置这些字段的值。如何实现?
我的控制器:
public function article_edit($action, Request $request)
{
$form = $this->createForm(ArticleType::class);
// Customize the form
$form->remove("versionTimestamp");
$form->remove("versionUserId");
$form->remove("version");
$form->add('save', SubmitType::class, ['label' => 'Zapisz']);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$article = $form->getData();
/*
$article->setVersionUserId($user);
$article->setVersionTimestamp(new \DateTime());
$article->setVersion(1);
*/
/.../
正如 Omar Makled 评论的那样,validation groups 是实现这一目标的一种方式。 TBH,我更喜欢不同的方法:
$article = new Article();
$article->setVersionUserId($user);
$article->setVersionTimestamp(new \DateTime());
$article->setVersion(1);
$form = $this->createForm(ArticleType::class, $article); // <- preset
$form->add('save', SubmitType::class, ['label' => 'Zapisz']);
if ($form->isSubmitted() && $form->isValid()) {
$article = $form->getData();
// do other stuff...
}
(注意:调用一个字段 "userId" 很奇怪,当你为它分配一个用户时,但那只是我)
我认为预提交事件是实现您想要的效果的最佳方式https://symfony.com/doc/current/form/events.html
我正在使用 Symfony 4.2.3.
我有一个名为 Article
的实体,其中包含以下字段:
- 版本
- versionUserId
- 版本时间戳
其中有 * @Assert\NotNull
验证标记。
我想在控制器中手动设置这些字段的值,例如使用:
$article->setVersionUserId($user);
$article->setVersionTimestamp(new \DateTime());
$article->setVersion(1);
但是,据我了解 $form->isValid()
,验证对象而不是表单。因此,为了防止 This value should not be null.
验证错误 我必须在验证表单之前设置这些字段的值。如何实现?
我的控制器:
public function article_edit($action, Request $request)
{
$form = $this->createForm(ArticleType::class);
// Customize the form
$form->remove("versionTimestamp");
$form->remove("versionUserId");
$form->remove("version");
$form->add('save', SubmitType::class, ['label' => 'Zapisz']);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$article = $form->getData();
/*
$article->setVersionUserId($user);
$article->setVersionTimestamp(new \DateTime());
$article->setVersion(1);
*/
/.../
正如 Omar Makled 评论的那样,validation groups 是实现这一目标的一种方式。 TBH,我更喜欢不同的方法:
$article = new Article();
$article->setVersionUserId($user);
$article->setVersionTimestamp(new \DateTime());
$article->setVersion(1);
$form = $this->createForm(ArticleType::class, $article); // <- preset
$form->add('save', SubmitType::class, ['label' => 'Zapisz']);
if ($form->isSubmitted() && $form->isValid()) {
$article = $form->getData();
// do other stuff...
}
(注意:调用一个字段 "userId" 很奇怪,当你为它分配一个用户时,但那只是我)
我认为预提交事件是实现您想要的效果的最佳方式https://symfony.com/doc/current/form/events.html