gpt4 book ai didi

symfony - 表单事件监听器(如 TrimListener)如何为 Symfony 中的表单选项设置 "bound"?

转载 作者:行者123 更新时间:2023-12-02 22:28:32 24 4
gpt4 key购买 nike

对于 Symfony 中的文本字段类型,有一个 trim option .我很确定 trim() 操作是由 Form\Extension\Core\EventListener\TrimListener 执行的类(class)。它是 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');
}
}

最佳答案

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

并为该选项添加您的测试,就像他们为 trim 选项所做的那样。像这样的东西:

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

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

How to Override any Part of a Bundle

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

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

关于symfony - 表单事件监听器(如 TrimListener)如何为 Symfony 中的表单选项设置 "bound"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12635338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com