Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony2][Symfony]Walidacja danych
Szymciosek
post 10.05.2013, 15:07:22
Post #1





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
m44
post 10.05.2013, 18:48:49
Post #2





Grupa: Zarejestrowani
Postów: 63
Pomógł: 10
Dołączył: 16.11.2008

Ostrzeżenie: (0%)
-----


Przecież w podanej przez Ciebie dokumentacji masz Regex.
Go to the top of the page
+Quote Post
Crozin
post 10.05.2013, 18:58:06
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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ą.

Ten post edytował Crozin 10.05.2013, 23:38:29
Go to the top of the page
+Quote Post
Szymciosek
post 11.05.2013, 01:40:28
Post #4





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


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

Ten post edytował Szymciosek 10.05.2013, 23:18:42
Go to the top of the page
+Quote Post
thek
post 11.05.2013, 21:44:16
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.04.2024 - 07:58