Каково рекомендуемое место для изменения данных привязанной формы в Symfony?

У меня есть форма для создания нового Customer. У клиента может быть номер мобильного телефона. Мобильный номер должен сохраняться без префикса + или 00, который пользователь может ввести. Это можно легко выполнить с помощью:

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

Какое место лучше всего разместить в этом коде?

  • Внутри CustomerController перед менеджером сущности вызова и сохраняйте объект. Это действительно вопрос контроллера в шаблоне MVC?
  • Использование SanitizeCustomerSubscriber и прослушивания события FormEvents:POST_BIND
  • Использование службы CustomerSanitizer

Любая другая идея? Конечно, я говорю о манипуляции с данными в целом, номер мобильного телефона - это всего лишь пример: поля, подлежащие дезинфекции, могут быть более чем одним.

Ответы

Ответ 1

Вы должны сделать это в событии 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.

Ответ 2

Я бы поставил это в метод Customer setMobile() - чем ближе к данным, тем лучше. Таким образом, мобильный номер будет дезинфицирован независимо от того, какие контроллеры или формы используются для его настройки.