是否可以将 PRE_SET_DATA 事件中的自定义数据属性设置为表单标签本身?

Is it possible to set a custom data attribute from whithin a PRE_SET_DATA event to the form tag itself?

我有一个 Blog 实体,它有一个 slug,我想要这个 slug保存在表单标签内的自定义数据属性中,如下所示:<form data-article-slug="my-slug">.

这是我期望达到的效果:

class BlogTypeSubscriber implements EventSubscriberInterface
{
    public function onPreSetData(FormEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();
        $slug = $data->getSlug();

        if (!empty($slug)) /* the bellow method does not exist */
            $form->setAttr([ 'data-article-slug' => $slug ]);
    }

    public static function getSubscribedEvents()
    {
        return [ FormEvents::PRE_SET_DATA => 'onPreSetData' ];
    }
}

可以在 twig 模板中做几乎相同的事情,例如:{{ form_start(form, { 'attr': { 'data-article-slug' : form.vars.value.slug } }) }} 但我发现这种方式非常冗余而且对 symfony 不友好,我该如何实现?

基本上接下来的思路是: 您需要创建(或您已经拥有)表单类型: 例如

class YourEntityType extends AbstractType
{
   public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->setAttribute('somefield')
            ->setAttribute('slug');

        $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function (FormEvent $event) use ($builder){
               /** @var YOURENTITY $data */
               $data = $builder->getData();

               if ($data->getSlug()) {
                  $builder->setAttribute('data-article-slug', $data->getSlug());
               }
            }
        );
    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(['data_class' => YOURENTITYCLASSNAMEHERE::class]);
    }
}

}

所以在这个例子中我们创建了一个实体表单类型,带有事件监听器。在集合数据上,如果你有一个 slug,那么 data-article-slug 属性将被添加到一个表单中。

进一步阅读:

1.forms (see data_class)

2.pre set data event

很遗憾,这是不可能的。一旦 $builder->getForm() 被调用,表格就会被锁定。这是设计的一部分,允许在构建后修改表单可能会导致问题,因为必须解决选项,这只能通过表单构建过程来实现。

另外你可以阅读这个: 也许这样: https://github.com/symfony/symfony/issues/20311