2012-07-28 10 views
14

Mam formularz do tworzenia nowego Customer. Klient może mieć numer telefonu komórkowego. Numer telefonu komórkowego powinien być zachowany bez prefiksu, który użytkownik może wpisać. Można to łatwo osiągnąć za pomocą:Jakie jest sugerowane miejsce do modyfikowania danych formularza powiązanego w Symfony?

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

Jakie jest najlepsze miejsce do umieszczenia tego kodu?

  • Wewnątrz CustomerController przed wywołaniem menedżera encji i utrwalenia encji. Czy to naprawdę kwestia kontrolera w strukturze MVC?
  • Korzystanie SanitizeCustomerSubscriber i słuchanie FormEvents:POST_BIND imprezy
  • Korzystanie z CustomerSanitizer usługę

Każdy inny pomysł? Oczywiście mówię o manipulacji danymi w ogólności, numer telefonu komórkowego jest tylko przykładem: pola do sanityzacji mogą być czymś więcej niż jednym.

Odpowiedz

42

Powinieneś to zrobić w zdarzeniu PRE_BIND, gdzie możesz uzyskać dostęp do przesłanych danych przed ich przetworzeniem.

$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); 
}); 

Dla rekordu, podobnie jak w przypadku Symfony 2.3, wydarzenie to nosi nazwę PRE_SUBMIT.

+0

Mam ** registerAction w BookController **, który wykorzystuje podobne zdarzenie PRE_SUBMIT do manipulowania danymi formularza. Ja działam dobrze. Ale po utworzeniu ** loginAction w SecurityController ** dzisiaj, za każdym razem, gdy zgłoszę akcję logowania, to (kontrola programowa) przechodzi do ** PRE_SUBMIT ** zdarzenia stworzonego dla akcji rejestru. Jak uniknąć tego przerwania akcji logowania za pomocą zdarzenia PRE_SUBMIT utworzonego dla akcji rejestru? ** Uwaga: ** oba kontrolery używają tej samej klasy encji. – webblover

10

Umieściłbym to w metodzie CustomersetMobile() - im bliżej samych danych, tym lepiej. W ten sposób numer telefonu komórkowego zostanie poddany sanityzacji bez względu na to, jakich kontrolerów lub formularzy użyto do jego ustawienia.

+0

Poza tym Bernhard Schussek jest opiekunem Symfony Form, myślę, że jest dużo lepszy (w tym przypadku) zrób to również w setMobile(). – felipsmartins

Powiązane problemy