Symfony验证:相关字段中未显示错误消息



Symfony 5.2.5

精简代码

//Entities
class Article {
/**
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMOneToMany(targetEntity=ArticleTranslation::class, mappedBy="article", cascade={"persist"}, orphanRemoval=true)
* @AssertValid
*/
private $translations;
}
class ArticleTranslation {
/**
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMColumn(type="string", length=255)
* @AssertNotBlank
*/
private $title;
/**
* @ORMColumn(type="text")
* @AssertNotBlank
*/
private $body;
/**
* @ORMManyToOne(targetEntity=Article::class, inversedBy="translations")
* @ORMJoinColumn(nullable=false)
*/
private $article;
/**
* @ORMColumn(type="string", length=5)
* @AssertNotBlank
*/
private $locale;
}

//FormTypes
class ArticleType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(/*other fields*/)
->add('translations', ArticleTranslationType::class, ['label' => false, 'data' => new ArticleTranslation(), 'mapped' => false])
->add('save', SubmitType::class, ['label' => 'Save']);
$builder->get('translations')->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
$entity = $event->getForm()->getParent()->getData();
$translation = $event->getData();
$translation->setLocale($this->localeService->getCurrentLocale()); //custom service returns e.g. "en"
$entity->addTranslation($translation);
});
}
}
class ArticleTranslationType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', TextType::class)
->add('body', TextareaType::class);
}
}

我有两个名为ArticleArticleTranslation的实体,它们具有OneToMany关系。创建Article时,我想添加一个ArticleTranslation(例如英语(,这样至少可以提供1个翻译。文章本身只存储发布日期等通用数据,而翻译则存储标题和内容(称为正文(。上面的代码运行良好,我唯一的问题是:

titlebody的验证失败时,错误消息显示在公式上方,而不是相关字段旁边。每个其他字段旁边都有错误消息。我使用默认的bootstrap 4表单主题。

如何将错误消息移动到正确的字段?Symfony探查器返回data.translations[0].body不应该为null(因为它是一个集合,所以它有一个索引(-我想我需要以某种方式将其放入data.translations.body中才能工作?


临时修复:在我的ArticleTranslationType&移除其工作的AssertValid约束。仍然对我提供的代码的另一个解决方案感兴趣-谢谢

您要查找的是error_bubbling FormType字段选项。

错误_气泡

类型:boolean默认:false,除非形式为复合形式。

如果是true,则此字段的任何错误都将传递给父字段或窗体。例如,如果在普通字段上设置为true,则该字段的所有错误都将附加到主窗体,而不是特定字段


您的ArticleTranslationTypecompound,因此error_bubbling默认为true
以下内容应该能起作用。

$builder->add(
'translations', ArticleTranslationType::class, array(
'data' => new ArticleTranslation(),
'error_bubbling' => false,
'mapped' => false,
'label' => false
)
);

经过反复尝试,我终于找到了解决方案。由于验证试图验证我的集合中的第一个元素,例如data.translations[0].body,我只需要提供正确的属性路径就可以知道。

$builder->add(
'translations', ArticleTranslationType::class, array(
'data' => new ArticleTranslation(),
'mapped' => false,
'label' => false,
'property_path' => 'translations[0]' //first element of collection
)
);

这会将错误消息映射到相应的字段。

相关内容

  • 没有找到相关文章

最新更新