我有一个用于创建新Customer
的表单。客户可能拥有手机号码。移动电话号码应保留在没有用户可以输入的+
或00
前缀的情况下。这可以通过以下方式轻松完成:
$customer->setMobile(preg_replace("/^(\+|00)/", '', $customer->getMobile()));
放置此代码的最佳位置是哪个?
CustomerController
内,并保留实体。这真的是MVC模式中的控制器问题吗?SanitizeCustomerSubscriber
并聆听FormEvents:POST_BIND
事件CustomerSanitizer
服务还有其他想法吗?当然,我说的是一般的数据操作,手机号码只是一个例子:要消毒的字段可能不仅仅是一个。
答案 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()
方法 - 越接近数据本身越好。这样,无论使用哪种控制器或表格来设置移动电话号码,都将对其进行消毒。