在Symfony中修改绑定表单数据的建议位置是哪个?

时间:2012-07-28 01:43:40

标签: symfony symfony-forms

我有一个用于创建新Customer的表单。客户可能拥有手机号码。移动电话号码应保留在没有用户可以输入的+00前缀的情况下。这可以通过以下方式轻松完成:

$customer->setMobile(preg_replace("/^(\+|00)/", '', $customer->getMobile()));

放置此代码的最佳位置是哪个?

  • 在呼叫实体经理之前的CustomerController内,并保留实体。这真的是MVC模式中的控制器问题吗?
  • 使用SanitizeCustomerSubscriber并聆听FormEvents:POST_BIND事件
  • 使用CustomerSanitizer服务

还有其他想法吗?当然,我说的是一般的数据操作,手机号码只是一个例子:要消毒的字段可能不仅仅是一个。

2 个答案:

答案 0 :(得分:42)

您应该在PRE_BIND事件中执行此操作,您可以在此事件中访问提交的数据。

$builder->addEventListener(FormEvents::PRE_BIND, function (FormEvent $event) {
    $data = $event->getData();
    if (isset($data['mobile'])) {
        $data['mobile'] = preg_replace("/^(\+|00)/", '', $data['mobile']);
    }
    $event->setData($data);
});

对于记录,从Symfony 2.3开始,此事件称为PRE_SUBMIT

答案 1 :(得分:10)

我将其放入Customer setMobile()方法 - 越接近数据本身越好。这样,无论使用哪种控制器或表格来设置移动电话号码,都将对其进行消毒。