2

Symfony 中的文本字段类型有一个修剪选项。我很确定该trim()操作是由Form\Extension\Core\EventListener\TrimListener班级进行的。它是事件的侦听器PRE_BIND并调用:

$event->setData(trim($event->getData()));

我想提供我自己的"normalize_spaces"选择:

$builder->add('last_name', 'text', array(
    'label'           => 'Last name',
    'normlize_spaces' => true
));

我怎样才能提供这个选项与我的NormalizeSpacesListener

class NormalizeSpacesListener implements EventSubscriberInterface
{
    public function preBind(FormEvent $event)
    {
        $data = $event->getData();

        if (is_string($data)) {
            $event->setData(preg_replace('/[ ]{2,}/', ' ', $data));
        }
    }

    public static function getSubscribedEvents()
    {
        return array(FormEvents::PRE_BIND => 'preBind');
    }
}
4

1 回答 1

5

我认为您可能会覆盖 Symfony 核心 FormType 类,尤其是 buildForm 方法: https ://github.com/symfony/symfony/blob/master/src/Symfony/Component/Form/Extension/Core/Type/FormType.php

并为该选项添加您的测试,就像他们为修剪选项所做的那样。就像是:

Class MyFormType Extends FormType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         parent::buildForm($builder, $options);

         if ($options['normalize_spaces']) {
             $builder->addEventSubscriber(new NormalizeSpacesListener());
         }
     }
 }

要覆盖该类并让系统使用它而不是默认的核心类,您可以使用服务容器并更改服务 form.type.form 的类

看看它是如何在这里声明的:https ://github.com/symfony/symfony/blob/master/src/Symfony/Bundle/FrameworkBundle/Resources/config/form.xml

并阅读本文以了解如何实际告诉服务容器使用您自己的类而不是默认类:

如何覆盖捆绑包的任何部分

注意:这就是我尝试这样做的方式,但我没有测试我刚刚写的内容

另一种选择是将您的侦听器附加到您构建的每个表单,而不是使其成为默认选项。我认为这也可以。

于 2012-09-29T07:20:34.310 回答