自定义字段类型的默认属性不会显示在HTML中


Default attributes from custom field type does not show up in HTML

我正在尝试使用自定义表单类型实现Facebook风格的自动完成字段。JavaScript小部件依赖于类名,因此我将其添加到自定义表单类型类中的attr键中,就像我在其他地方所做的那样,但由于某种原因,它从未显示在输出HTML中:-

相关代码:

class AutocompleteType extends AbstractType
{
    protected $em;
    public function __construct(ObjectManager $em)
    {
        $this->em = $em;
    }
    public function getDefaultOptions(array $options)
    {
        return array(
            'attr' => array(
                'class' => 'autocomplete',
                'data-autocomplete' => '{"url":"'.$options['url'].'"}'
            )
        );
    }
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'url' => false,
            'object' => false,
            'repository' => false,
            'field' => false
        ));
    }
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $transformer = new AutocompleteTransformer($this->em, $options['object'], $options['repository'], $options['field']);
        $builder->addModelTransformer($transformer);
    }
    /**
    * {@inheritdoc}
    */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars = array_replace($view->vars, array(
            'url' => $options['url'],
            'object' => $options['object'],
            'repository' => $options['repository'],
            'field' => $options['field']
        ));
    }
    public function getParent()
    {
        return 'text';
    }
    public function getName()
    {
        return 'autocompleter';
    }
}
生成的HTML:
<input type="text" required="required" name="post[Tags]" id="post_Tags">
预期HTML

<input type="text" class="autocomplete" data-autocomplete="url/passed/from/builder" required="required" name="post[Tags]" id="post_Tags">

有三种方法,我不知道哪一种更好

1)在buildForm()方法下,你可以获取和设置属性'attr':

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $attrs = $builder->getAttribute('attr');
    ...
    $builder->setAttribute('attr', $attrs);
}

2)另一种方法是在构建视图下设置属性,我认为这更符合逻辑

public function buildView(FormView $view, FormInterface $form, array $options)
{
    $view->vars['attr'] = array_merge(array(
        ....
    ), $view->vars['attr']);
}

3)最新的方法是将它们直接作为视图中的变量传递,而不是在'attr'中传递,然后在适当的分支块中显示它们。

我认为第三种方法是最好的,但我不确定。