2014-04-15 11 views
6

Próbuję dodać parametr obejmujący cały pakiet do mojej aplikacji, aby można było dodać go do mojego pliku sprawdzania poprawności (validation.yml):Jak przekazać parametr do ograniczenia sprawdzania poprawności w Symfony2 - w yml

myApp\myBundle\Entity\Contact: 
properties: 
    name: 
     - NotBlank: { message: "%myvariable%" } 

dodałam mój parametr zwykle w config.yml:

parameters: 
    # Validation config 
    myvariable: Please tell us your name. 

ale strona po prostu renderuje% myVariable% tekstu, zamiast pożądanego łańcucha. Chciałbym również użyć tego parametru w moim FormBuilderInterface podczas dodawania wiadomości sprawdzania poprawności do strony do użycia w JavaScript. Czy pozwala na to yml? Jeśli nie, w jaki sposób uwzględnić taki parametr na wyższym poziomie?

+0

Miałem to samo pytanie (i nie znalazłem tego wcześniej), które ma kilka interesujących komentarzy (ale nie ma jeszcze odpowiedzi): http://stackoverflow.com/questions/42486647/use-parameters-in-validation –

Odpowiedz

1

Nie, obecnie nie jest to możliwe.

Nie ma nic wspólnego z YAML lub XML ani nawet z definicjami usług. Składnik walidatora samodzielnie odczytuje reguły sprawdzania poprawności - jak widać struktura jest zupełnie inna niż w przypadku definicji usług. Niestety nie zastępuje parametrów w wiązaniach.

Główna logika znajduje się w \Symfony\Component\Validator\Mapping\Loader\YamlFileLoader, która jest tworzona przez \Symfony\Component\Validator\ValidatorBuilder::getValidator.

Można tego dokonać poprzez:

  1. Zastępowanie definicja validator.builder usługi.

Jest zbudowany przy użyciu %validator.builder.factory.class%::createValidatorBuilder, ale jak trzeba dostać torbę parametru jakoś, nie ma wystarczająco dużo zależnościami - fabryka klasa jest w użyciu, nie serwisu fabrycznego.

  1. Tworzenie nowej klasy, która rozszerza się o ValidatorBuilder.

Powinieneś wziąć torbę parametrów do konstruktora lub przez settera. Powinien być skonfigurowany w kroku (1) do przekazania tutaj.

Ta klasa tworzy pliki ładujące innej klasy (patrz 3), również przekazuje do niej ten pakiet parametrów.

  1. Tworzenie nowych klas dla YamlFileLoader i YamlFilesLoader. Dodatkowe 2 dla każdego formatu, który chciałbyś obsłużyć.

Dodatkowo wziąłby worek parametrów do konstruktora i zastąpiłby niektóre funkcje. Na przykład, myślę, że obsługa wszystkich parametrów może być wykonana w metodzie newConstraint - iterowanie przez opcje, rozwiązywanie parametrów, a następnie wywoływanie metody nadrzędnej z zastąpionymi opcjami.


To miłe, że Symfony może zostać rozszerzony tak (może nie tak ładnie w tym użytkowej przypadku), ale myślę, że byłoby łatwiej po prostu napisać własne ograniczenia z niestandardowych więzów weryfikatora, który wstrzykiwać że parametr do niego.

Weź również pod uwagę opakowanie usługi sprawdzania poprawności - jeśli musisz tylko wymienić komunikaty sprawdzania poprawności, możesz zastąpić usługę validator, wprowadzając do niej oryginalny. Aby uzyskać więcej informacji, patrz http://symfony.com/doc/current/service_container/service_decoration.html.