Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Symfony]Nowy walidator
kamil.deb
post
Post #1





Grupa: Zarejestrowani
Postów: 22
Pomógł: 1
Dołączył: 13.06.2009

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


Witam

Chciałbym napisać nowy validator sprawdzający np. czy pierwsza litera wyrazu jest napisana wielką literą. Gdzie taką f. powinienem napisać.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
destroyerr
post
Post #2





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


Nie mogę znaleźć, a widziałem już coś przyzwoitego na ten temat.
Nic straconego, walidatory są proste. Jeśli to co w dokumentacji jest zawarte to za mało, to zajrzyj do wbudowanych walidatorów. Powinieneś dowiedzieć się tam wszystkiego.
W metodzie configure oczywiście konfigurujesz (ustawiasz dostępne opcje i wiadomości), a metoda doClean zajmuje się już walidacją. W przypadku błędu rzucasz wyjątkiem z klasy sfValidatorError lub sfValidatorErrorSchema. To chyba wszystko co najważniejsze.

Mam wrażenie, że na tym forum też już o tym było.
Go to the top of the page
+Quote Post
Crozin
post
Post #3





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

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


O tym jak napisać walidator wspomniał już destroyerr, ja tylko dodam, że dobrze by było gdybyś odpowiednio przewidział miejsce zapisu nowego walidatora.
Jeżeli będzie on używany wyłącznie w obrębie jednego modułu to wrzucasz go do SF_ROOT/apps/APP/modules/MODULE/lib
Jeżeli w obrębie jednej aplikacji do SF_ROOT/apps/APP/lib
A jeżeli w obrębie całego projektu do SF_ROOT/lib

Pamiętaj tylko by nie mieszać Twoich plików ze źródłami Symfony
Go to the top of the page
+Quote Post
m-naw
post
Post #4





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 22.06.2009

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


Ja bym to zrobil tak:

  1. <?php
  2. class myValidatorFirstLetter extends sfValidatorSchema
  3. {
  4.  public function __construct($string, $options = array(), $messages = array())
  5.  {
  6.    $this->addOption('string', $string);
  7.    $this->addOption('throw_global_error', false);
  8.  
  9.    parent::__construct(null, $options, $messages);
  10.  }
  11.  
  12.  protected function doClean($values)
  13.  {
  14.    if (is_null($values))
  15.    {
  16.      $values = array();
  17.    }
  18.  
  19.    if (!is_array($values))
  20.    {
  21.      throw new InvalidArgumentException('Proszę podać parametr do metody doClean()');
  22.    }
  23.  
  24.    $string  = isset($values[$this->getOption('string')]) ? $values[$this->getOption('string')] : null;
  25.  
  26.    if(ucfirst($string) != $string)
  27.    {
  28.      throw new sfValidatorError($this, 'invalid');
  29.    }
  30.  
  31.    return $values;
  32.  }
  33. }
  34.  
  35. ?>


Widziałem niedawno ogłoszenie o prace gdzie jako zadanie trzeba było walidować imię aby pierwsza litera była z dużej. Czy czasem nie aplikujesz do nich? (IMG:http://forum.php.pl/style_emoticons/default/aaevil.gif)
Go to the top of the page
+Quote Post
destroyerr
post
Post #5





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


Dlaczego dziedziczysz po sfValidatorSchema. Wynikają z tego tylko dalsze błędy w kodzie. Zdecydowanie powinna być rozszerzana klasa sfValdiatorBase.

Cytat
  1. <?php
  2. public function __construct($string, $options = array(), $messages = array())
  3. {
  4.   $this->addOption('string', $string);
  5.   $this->addOption('throw_global_error', false);
  6.  
  7.   parent::__construct(null, $options, $messages);
  8. }
  9. ?>

Totalnie nie to miejsce, wspomniałem już wcześniej, że od tego jest metoda configure.
Opcja throw_global_error wcale nie jest obsłużona.

Cytat
  1. <?php
  2. if (is_null($values))
  3.   {
  4.     $values = array();
  5.   }
  6.  
  7.   if (!is_array($values))
  8.   {
  9.     throw new InvalidArgumentException('Proszę podać parametr do metody doClean()');
  10.   }
  11. ?>

A jeśli podam null w tym polu? to nadal nie będzie parametrów. Wywaliłbym ten wyjątek i skorzystał bym z opcji required.
Go to the top of the page
+Quote Post
-=Peter=-
post
Post #6





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

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


A nie lepiej wykorzystać walidator symfony sfValidatorRegex z odpowiednim wyrażeniem regularnym?

Ten post edytował -=Peter=- 2.07.2009, 11:55:32
Go to the top of the page
+Quote Post
destroyerr
post
Post #7





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


Jeśli chodzi stricte o to sprawdzanie, to na pewno sfValidatorRegex jest lepszym rozwiązaniem, tym bardziej, że ten zaproponowany walidator nie sprawdza w ogóle czy to jest string.
Zastanawiałem się tylko jak wygląda sprawa wydajności z wyrażeniem regularnym. Jeśli to jest tylko jeden wyraz no to bez przesady, ale jeśli jest to tekst to lepiej wycinać pierwszą literę i dopiero sprawdzać, ale może też przesadzam.
Go to the top of the page
+Quote Post
m-naw
post
Post #8





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 22.06.2009

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


Przyznaje się, można to rozwiązać prościej. Co do błędów to moim zamierzeniem było użycie tego walidatora jako PostValidator (dlatego ValidatorSchema nie Base). Wcześniej pole byłoby sprawdzone sfValidatorString. No ale racja nie jest to dobre rozwiązanie.

  1. <?php
  2.  
  3. class myValidatorFirstLetter extends sfValidatorRegex
  4. {
  5.  
  6.  protected function configure($options = array(), $messages = array())
  7.  {
  8.    parent::configure($options, $messages);
  9.  
  10.    $this->setMessage('invalid', 'String musi składać się z liter i zaczynać się z dużej litery');
  11.    $this->setMessage('required', 'Proszę podać string');
  12.  
  13.    $this->setOption('pattern', '/^[A-Za-zĘÓĄŚŁŻŹŃęóąśłżźćń]+$/');
  14.  }
  15.  
  16.  protected function doClean($value)
  17.  {
  18.    $clean = parent::doClean($value);
  19.  
  20.    if(ucfirst($clean) != $clean)
  21.    {
  22.        throw new sfValidatorError($this, 'invalid');
  23.    }
  24.    
  25.    return $clean;
  26.  }
  27. }
  28. ?>


Jak widać to jest przypadek gdzie string miałby się składać z samych liter. A jaki wzorzec należałoby podać do sfValidatorRegex aby go użyć w tym przypadku?

Ten post edytował m-naw 2.07.2009, 14:10:50
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 12:51