我有一个表单来创建一个新的客户.客户可能有手机号码.移动号码应该持久化,不能使用或00前缀,用户可以键入.这可以很容易地实现:
$customer->setMobile(preg_replace("/^(\+|00)/",'',$customer->getMobile()));
这是代码最好的地方?
>在客户控制器之前,调用实体管理器并持续实体.这真的是MVC模式中的控制器的问题吗?
>使用SanitizeCustomerSubscriber并监听FormEvents:POST_BIND事件
>使用CustomerSanitizer服务
任何其他想法?当然,我在谈论数据操作一般来说,手机号码只是一个例子:要消毒的字段可能不止一个.
解决方法
您应该在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.