14

我有一个用于创建新的Customer. 客户可能有一个手机号码。手机号码应不带用户可键入的前缀+或前缀。00这可以通过以下方式轻松完成:

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

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

  • CustomerController调用实体管理器并持久化实体之前的内部。这真的是 MVC 模式中的控制器问题吗?
  • 使用SanitizeCustomerSubscriber和监听FormEvents:POST_BIND事件
  • 使用CustomerSanitizer服务

还有什么想法吗?当然我说的是一般的数据处理,手机号码只是一个例子:要清理的字段可能不止一个。

4

2 回答 2

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.

于 2012-07-28T06:21:14.340 回答
10

我会把它放到Customer setMobile()方法中——越接近数据本身越好。这样,无论使用什么控制器或表单来设置手机号码,都会对手机号码进行消毒。

于 2012-07-28T07:59:34.840 回答