通过订阅者动态编辑表单

Edit form dynamically through subscriber

// buildForm
...
->add('book', 'entity', [
    'class' => 'MyBundle\Entity\Book',
    'choices' => [],
])
->addEventSubscriber(new MySubscriber());

通过 javascript 填写外业书籍并获取书名。 我需要做的是检查这本书是否已经存在于我的数据库中,否则我创建它。我为此创建了一个订阅者,效果很好。

问题是我无法摆脱 $form->handleRequest($request)->isValid() 发出的错误,这很奇怪,因为我在订阅者中以这种方式编辑了请求中的数据:

public function preSetData(FormEvent $event)
{
    ...
    $author = $event->getData();
    $requestForm = $this->request->request->get('mybundle_author');
    $bookTitle = $requestForm['book'];

    // if this book title doesn't exist -> create it
    ...


    $requestForm['book] = (string) $book->getId();
    $this->request->request->set('mybundle_author', $requestForm);
}

无论我使用什么FormEvents,它都会发出账面价值无效的错误

我用 entity 类型遇到了类似的问题。

问题是新实体没有被标记为托管,实体类型侧重于选择现有实体。您可以将 ObjectManager 传递给订阅者并将实体设置为托管(使用持久化),或者您自己消除验证错误。后者更干净,但可能需要更多工作。

删除选项选项解决了问题。 我的订户是正确的,但在我的表格中我必须编辑字段

// buildForm
...
->add('book', 'entity', [
    'class' => 'MyBundle\Entity\Book',
    //'choices' => [], // removing this fixed the problem
])
->addEventSubscriber(new MySubscriber());