Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF][SF3] Walidator dla encji formularza
Forum PHP.pl > Forum > PHP > Frameworki
nospor
Hejka, mam jakas tam encje

  1. class SomeEntity
  2. {
  3. /**
  4.   * @ORM\ManyToOne(....)
  5.   * @ORM\JoinColumn(....)
  6.   */
  7. private $some1;
  8.  
  9. /**
  10.   * @ORM\ManyToOne(....)
  11.   * @ORM\JoinColumn(...)
  12.   * @AcmeAssert\UniqueSome2
  13.   */
  14. private $some2;
  15.  
  16. ...
  17. }


Teraz mam contrait dla some2

  1. class UniqueSome2 extends Constraint
  2. {
  3. public $message = 'Some message';
  4. }
  5.  

ktory to wola walidator

  1. class UniqueSome2Validator extends ConstraintValidator
  2. {
  3. /**
  4.   * @var EntityManager
  5.   */
  6. private $em;
  7.  
  8. public function __construct(EntityManager $em)
  9. {
  10. $this->em = $em;
  11. }
  12.  
  13. public function validate($some2, Constraint $constraint): void
  14. {
  15. ....
  16. }
  17.  
  18. protected function addViolation(Constraint $constraint): void
  19. {
  20. $this->context->buildViolation($constraint->message)
  21. ->addViolation();
  22. }
  23. }

Jest to standardowy mechanizm walidac pol encji. Dziala ladnie pieknie gdy waliduje pole encji, ktore jest niezalezne w walidacji od innych pol. Niestety podczas walidacji $some2 potrzebuje jeszcze wartosci $some1. Niestetety w metodzie validate() w ostatniej klasie otrzymuje tylko $some2. Idzie jakos sie dobrac do reszty pol z mojej encji?
Crozin
Albo UniqueSome2 ustawiasz jako walidator dla obiektu klasy SomeEntity, a nie pola, albo korzystasz z $context (odziedziczone z ConstraintValidator) by przejść po grafie obiektów w odpowiednie miejsce. Polecałbym razczej pierwszą opcję.
nospor
Probowalem opcji pierwszej juz wczesniej, ale rzucalo mi bledem ze nie moge ustawic walidatora dla klasy. Nie wykluczone, ze zle za to sie zabralem w takim razie. Jakies wskazowki dokladniejsze?

Co do opcji drugiej to tez probowalem z $context ale nie bylem wstanie znalezc sciezki do mojej glownej klasy. Jakies wskazowki gdzie mialbym tego szukac w $context? smile.gif
Crozin
1. By SomeUnique2 mogło działać dla klasy musi mieć napisaną metodę getTargets(), która powinna zwrócić self::CLASS_CONSTRAINT.
2. Oż Ty leniuszku... http://api.symfony.com/3.1/Symfony/Compone...tInterface.html :-P (np. getRoot()).
nospor
Misio glodny to i leniwy wink.gif
A na powaznie szukalem ale kurcze ciagle mi uciekalo. Dzieki, postaram sie pozniej sprawdzic info od ciebie i nieomieszkam poinformowac o wynikach smile.gif

edit:
@Crozin dzieki wielkie. Oczywiscie obie metody dzialaja. NIe wiem co za pomrocznosc mialem ze tej drugiej sciezki nie znalazlem... Oczywiscie tak czy siak wybieram metode nr1 bo zgadzam sie z toba, iz to ona tutaj jest odpowiednia smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.