2014-05-05 22 views
5

tl; dr:Dodaj niestandardowy weryfikator na niezmapowanym polu, ale w kontekście całego przesyłania formularza?

  1. muszę ograniczenie zwyczaj sprawdzania poprawności, aby uruchomić na niezmapowanego pole formularza
  2. muszę identyfikator obiektu forma manipuluje, aby wyeliminować je z uwzględnieniem robi mój ograniczenie sprawdzania
  3. Mocowanie walidacji do samej lub polu unmapped postaci nie daje mi tyle kontekst uruchomić moje zapytanie walidacja

Mam niezmapowane pole w moim formularzu encji Person, w którym muszę uruchomić sprawdzanie poprawności. Śledziłem this great article, jak to zrobić, ale mój przypadek użycia jest nieco inny i nie jest całkowicie objęty tym artykułem.

Tworzę własne unikalne ograniczenie, które musi uruchomić niestandardową kwerendę, aby określić unikalność. Aby uruchomić kwerendę, potrzebuję dostępu do wartości pola, która została przesłana, , a także oryginalnego obiektu Person (aby uzyskać identyfikator, jeśli jest to operacja aktualizacji). Bez tego obiektu nie będę mógł go wyeliminować podczas zapytania o unikalność.

Gdybym zastosować walidatora od klasy PersonType tak:

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver 
     ->setDefaults(array(
      'data_class' => 'CS\AcmeBundle\Entity\Person', 
      'constraints' => array(
       new MyUniqueValidator(), 
      ) 
     )) 
    ; 
} 

Następnie walidator pobiera przeszła całą Person obiektu do przeprowadzenia walidacji na. To mi nie pomoże, ponieważ przesłane dane formularza nie są przechowywane w obiekcie Person (jest to pole, które nie jest mapowane, które obsłużę po wywołaniu $form->isValid() w kontrolerze).

Gdybym zastosować walidator pola niezmapowanego bezpośrednio Zamiast:

$builder 
     ->add('myUnmappedField', 'text', array(
      'mapped' => false, 
      'constraints' => array(
       new MyUniqueValidator(), 
      ) 
      ), 
     )) 

Następnie obiekt I przejdzie do walidatora jest tylko samodzielna forma tekstu, i nic więcej. Nie mam obiektu ID Person (jeśli była to operacja aktualizacji) do wykonania przez zapytanie o unikalność.

Mam nadzieję, że wyjaśniłem to poprawnie. Czy mogę z wdzięcznością wykonywać takie opcje sprawdzania poprawności?

Odpowiedz

5

Mówisz, że masz niezmapowane pole. Czy pomogłoby to, gdybyś zmapował go na jednostkę Osoby? Po prostu utwórz nową właściwość w klasie Person za pomocą metod getter i setter, ale nie w ORM, ponieważ nie chcesz, aby była trwała.

Jeśli nie chcesz polutować swojej klasy Person, możesz również utworzyć inną klasę złożoną, która będzie zawierać aktualnie odwzorowane pole i obiekt Person (następnie zmapujesz go). Oczywiście ustawisz parametr data_class tak, aby pasował do przestrzeni nazw nowego obiektu.

Oba powyższe rozwiązania powinny działać z górnym kodem, który tam masz. Daj mi znać, że to pomogło.

+0

Dzięki. Poszedłem z dodaniem innej właściwości w mojej encji Person i odwzorowaniu na nią pola formularza. To działa dobrze. – Brian

+0

Cieszę się, że mogę pomóc;) A także w przyszłości, zawsze pamiętaj, formularz może mieć tylko jeden ukryty obiekt.Jeśli potrzebujesz więcej niż jednego obiektu lub czegoś w tym rodzaju, stwórz kolejny obiekt złożony i zawsze może on zawierać więcej obiektów/właściwości :) – tomazahlin

+3

oczywiście działa, ale nie może to być zaakceptowana odpowiedź na zadane pytanie. problem nie został przez to naprawiony, jest po prostu pominięty – AlexK