Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony2][Symfony]Walidacja danych
Forum PHP.pl > Forum > PHP > Frameworki
Szymciosek
Witam,
szukam jak zrobić walidację danych w symfony, ale wszystko kieruje mnie albo do korzystania z czegoś takiego: http://symfony.com/doc/2.0/book/validation.html
albo do tworzenia http://symfony.com/doc/2.0/reference/const.../MinLength.html

a moje pytanie:
jak zrobić prostą walidację powiedzmy pobranej nazwy użytkownika z formularza?
Formularz mam na "czysto" w html.

  1. <form action="{{ path('cms_login') }}" method="post">
  2. <input type="text" placeholder="Nazwa użytkownika" name="username" value="admin" />
  3. <input type="text" placeholder="Hasło" name="password" value="admin" />
  4. <div id="remember-me"><label for="remember-me">Zapamiętaj mnie</label><input type="checkbox" name="remember-me" checked /></div>
  5. <input type="submit" name="login_submit" value="Zaloguj" />
  6. <a href="#zapomnialem" id="forgot-password">Zapomniałem hasła</a>
  7. </form>


no i wcześniej jak robiłem w czystym php to zrobiłem walidację na podstawie:
  1. public function validateUsername($username)
  2. {
  3. if (preg_match("/^[a-zA-Z]{4,18}+$/", $username))
  4. return true;
  5. }


z tym, że to była moja klasa, którą mogłem sobie wykorzystać wszędzie tam, gdzie chciałem. Tutaj też teoretycznie mógłbym to zrobić, ale symfony2 chyba ma jakieś gotowe walidatory.
Tylko jak ich użyć na podanym przykładzie?
m44
Przecież w podanej przez Ciebie dokumentacji masz Regex.
Crozin
1. Dlaczego nie korzystasz z wbudowanego z Symfony generatora formularzy? Ułatwiłoby Ci to życie, gdyż nie musiał byś robić wszystkiego ręcznie.
2. Utwórz sobie obiekt reprezentujący dane z formularza, dodaj do niego odpowiednie reguły walidacji (np. za pomocą adnotacji), a następnie sprawdź jego poprawność:
  1. class LoginModel {\
  2. /** @Assert\NotBlank @Assert\MinLength(4) @Assert\MaxLength(18) @Assert\Regexp("[a-Z]+") */
  3. public $username;
  4.  
  5. ...
  6. public $password;
  7.  
  8. /** @Assert\Type("boolean") */
  9. public $rememberMe;
  10. }
  1. // Gdzieś tam po wysłaniu formularza wypełnij powyższy obiekt danymi po czym:
  2. $login = new LoginModel();
  3. ...
  4.  
  5. $errors = $this->get('validator')->validate($login);


Ale jak już napisałem - skorzystanie z frameworka od osbługi formularzy łatwiłoby Ci znacznie życie.

EDIT: Poprawiony błąd z nazwą.
Szymciosek
W sumie dlatego tylko z tego nie korzystałem jeszcze, bo dopiero zacząłem przerzucać podstawę swojego CMS'a do symfony2, a co za tym idzie, nie zagłębiałem się jeszcze w niego na tyle.

Jakiś czas temu miałem pierwsze podejście do Symfony2, ale w końcu stwierdziłem, że to jeszcze nieodpowiednia chwila na to, no i natrafiłem na większy problem z tym...


Crozin, wezmę sobie Twoją radę do serca, bo jeżeli to rzeczywiście wygląda tak jak opisałeś w LoginModel (chodzi o adnotacje), to super sprawa.

EDIT::
Ale co do tego:
  1. // Gdzieś tam po wysłaniu formularza wypełnij powyższy obiekt danymi po czym:
  2. $login = new Login();


to chyba powinno być new LoginModel? Tak tylko przeglądając dopiero to co napisałeś stwierdzam to, jeszcze nie testowałem.

Napotkałem problem:

  1. /**
  2.   * @Route("/panel/logowanie", name="cms_login")
  3.   * @Template("WebsiteCoreBundle:Default:login.html.twig")
  4.   */
  5. public function indexAction()
  6. {
  7. $request = Request::createFromGlobals();
  8. if ($request->getMethod() == "POST")
  9. {
  10. $this->username = $request->get('username');
  11. $this->password = $request->get('password');
  12. $this->rememberMe = $request->get('remember-me');
  13. $this->validate();
  14. }
  15.  
  16. $loginForm = $this->createFormBuilder()
  17. ->add('username', 'text', array(
  18. 'label' => ' ',
  19. 'attr' => array(
  20. 'placeholder' => 'Nazwa użytkownika'
  21. )
  22. ))
  23. ->add('password', 'text', array(
  24. 'label' => ' ',
  25. 'attr' => array(
  26. 'placeholder' => 'Hasło'
  27. )
  28. ))
  29. ->getForm();
  30.  
  31. return array('logged' => $this->session->get('logged'), 'login_form' => $loginForm->createView());
  32. }
  33.  
  34. /**
  35.   * Validates the input data from the login form
  36.   */
  37. private function validate()
  38. {
  39. $loginModel = new \Website\CoreBundle\Forms\Models\LoginModel();
  40. $loginModel->username = $this->username;
  41. $loginModel->password = $this->password;
  42. $loginModel->rememberMe = $this->rememberMe;
  43.  
  44. $errors = $this->get('validator')->validate($loginModel);
  45. var_dump($errors);
  46.  
  47. $entityManager = $this->getDoctrine()->getEntityManager();
  48. $this->userEntity = $entityManager->getRepository('WebsiteCoreBundle:CmsUsers')->findAll();
  49. }


  1. <?php
  2. namespace Website\CoreBundle\Forms\Models;
  3.  
  4. use Symfony\Component\Validator\Constraints as Assert;
  5.  
  6. class LoginModel
  7. {
  8. /**
  9.   * @Assert\NotBlank
  10.   * @Assert\MinLength(4)
  11.   * @Assert\MaxLength(18)
  12.   * @Assert\Regex("[a-Z]")
  13.   */
  14. public $username;
  15.  
  16. /**
  17.   * @Assert\NotBlank
  18.   * @Assert\MinLength(4)
  19.   * @Assert\MaxLength(18)
  20.   * @Assert\Regex("[a-Z]")
  21.   */
  22. public $password;
  23.  
  24. /**
  25.   * @Assert\Type("boolean")
  26.   */
  27. public $rememberMe;
  28. }


1) Nie mogłem zrobić czegoś takiego jak: * @Assert\Regex("[a-Z]+") -> błąd był z tym plusem - wywaliłem
2) var_dump zwraca mi:
Kod
object(Symfony\Component\Validator\ConstraintViolationList)[281]
  private 'violations' =>
    array (size=3)
      0 =>
        object(Symfony\Component\Validator\ConstraintViolation)[322]
          private 'message' => string 'This value should not be blank.' (length=31)
          private 'messageTemplate' => string 'This value should not be blank.' (length=31)
          private 'messageParameters' =>
            array (size=0)
              ...
          private 'messagePluralization' => null
          private 'root' =>
            object(Website\CoreBundle\Forms\Models\LoginModel)[279]
              ...
          private 'propertyPath' => string 'username' (length=8)
          private 'invalidValue' => null
          private 'code' => null
      1 =>
        object(Symfony\Component\Validator\ConstraintViolation)[330]
          private 'message' => string 'This value should not be blank.' (length=31)
          private 'messageTemplate' => string 'This value should not be blank.' (length=31)
          private 'messageParameters' =>
            array (size=0)
              ...
          private 'messagePluralization' => null
          private 'root' =>
            object(Website\CoreBundle\Forms\Models\LoginModel)[279]
              ...
          private 'propertyPath' => string 'password' (length=8)
          private 'invalidValue' => null
          private 'code' => null
      2 =>
        object(Symfony\Component\Validator\ConstraintViolation)[333]
          private 'message' => string 'This value should be of type boolean.' (length=37)
          private 'messageTemplate' => string 'This value should be of type {{ type }}.' (length=40)
          private 'messageParameters' =>
            array (size=2)
              ...
          private 'messagePluralization' => null
          private 'root' =>
            object(Website\CoreBundle\Forms\Models\LoginModel)[279]
              ...
          private 'propertyPath' => string 'rememberMe' (length=10)
          private 'invalidValue' => string 'on' (length=2)
          private 'code' => null


Nie ważne jak i kiedy, ale zawsze mam niby puste pole
Zauważyłem, że przy takim tworzeniu pól, name nadaje wartość form[username]... a nie jak normalnie w html miałem username, przez co nie mam dostępu może do tego z $request?

Jak to działa?

UPDATE::
Poprawiłem na

$dataFromLoginForm = $request->get('form');
a później
$this->username = $dataFromLoginForm['username'];

UPDATE::
Tylko dodało mi jakiś _token, po co on jest?

UPDATE
Już kurde próbowałem chyba wszystkich możliwości, jeśli chodzi o regex...

a zawsze dostaję:
Kod
object(Symfony\Component\Validator\ConstraintViolationList)[223]
  private 'violations' =>
    array (size=3)
      0 =>
        object(Symfony\Component\Validator\ConstraintViolation)[271]
          private 'message' => string 'This value is not valid.' (length=24)
          private 'messageTemplate' => string 'This value is not valid.' (length=24)
          private 'messageParameters' =>
            array (size=1)
              ...
          private 'messagePluralization' => null
          private 'root' =>
            object(Website\CoreBundle\Forms\Models\LoginModel)[42]
              ...
          private 'propertyPath' => string 'username' (length=8)
          private 'invalidValue' => string 'admin' (length=5)
          private 'code' => null
      1 =>
        object(Symfony\Component\Validator\ConstraintViolation)[264]
          private 'message' => string 'This value is not valid.' (length=24)
          private 'messageTemplate' => string 'This value is not valid.' (length=24)
          private 'messageParameters' =>
            array (size=1)
              ...
          private 'messagePluralization' => null
          private 'root' =>
            object(Website\CoreBundle\Forms\Models\LoginModel)[42]
              ...
          private 'propertyPath' => string 'password' (length=8)
          private 'invalidValue' => string 'admin' (length=5)
          private 'code' => null
      2 =>
        object(Symfony\Component\Validator\ConstraintViolation)[278]
          private 'message' => string 'This value should be of type boolean.' (length=37)
          private 'messageTemplate' => string 'This value should be of type {{ type }}.' (length=40)
          private 'messageParameters' =>
            array (size=2)
              ...
          private 'messagePluralization' => null
          private 'root' =>
            object(Website\CoreBundle\Forms\Models\LoginModel)[42]
              ...
          private 'propertyPath' => string 'rememberMe' (length=10)
          private 'invalidValue' => string 'on' (length=2)
          private 'code' => null


Mimo, że tutaj http://gskinner.com/RegExr/ ten sam ciąg znaków z regexp [a-zA-Z]+ działa dobrze...

FIXED
thek
To co opisał Crozin to prawda. By było ciekawiej, możesz napisać własne, customowe walidatory i je także poprzez adnotacje wpiąć. Choć moim zdaniem równie elegancko można to zrobić poprzez wpięcie w definicję Forma przy danym polu.

_token to CSRF Token formularza. Domyślnie jest on zawsze dodawany.

Co do Regex w SF2 to poczytaj o nim, bo ma jeszcze opcjonalny parametr match, który jest fajną opcją gdy zależy Ci na wzorcu zanegowanym.
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-2025 Invision Power Services, Inc.