Darekxp
9.11.2012, 13:51:22
Witam!
Zaczynam przygodę z OOP.
Czy idę w dobrym kierunku, czy zarys mojej pierwszej klasy walidacji i jej użycie jest bez sensu (jeśli tak co jest nie tak)?
class validation {
private $_string;
## TITLE ##
public function title($_string) {
{
echo 'Tytuł nie może być pusty.'; return false;
}
{
echo 'Tytuł jest za krótki.'; return false;
}
{
echo ' Tytuł jest za długi'; return false;
}
return true;
}
## TAGS ##
public function tags($_string) {
{
echo 'Tagi nie mogą być puste.'; return false;
}
{
echo 'Tagi są za krótkie.'; return false;
}
{
echo 'Tagi są za długie.'; return false;
}
return true;
}
}
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
$valid = new validation();
$news = new news();
$title = $valid->title($_POST['title']);
$tags = $valid->tags($_POST['tags']);
if($title && $tags)
{
$news->saveNews();
}
}
1. metody kasy powinny zwracać wartości (czyli pozbądź się echo)
2. zakładając że pasuje Ci to co napisałeś i używasz tylko title i tags... a co jeśli będziesz chciał coś dopisać? kolejna metoda? Nigdy nie powtarzaj kodu który już wcześniej napisałeś.
3. Zrób jedną metodę np.
public function addValid($date, $type)
{
// tu sprawdzasz czy dane istnieją i jakiego są typu
// jeśli nie, to wrzucasz błąd do zmiennej np. $error
}
4. Mając błędy w zmiennej $error, możesz je wyświetlać przez kolejną metodę i tak masz wszytko ładnie poukładane.
phpion
9.11.2012, 14:29:05
Moim zdaniem bardzo dobry mechanizm walidacji danych ma Kohana:
http://kohanaframework.org/3.3/guide/kohan...rity/validationZapoznaj się z powyższym linkiem i spróbuj stworzyć coś analogicznego. Generalnie idea jest taka, że tworzysz klasę Valid, która zawiera gotowe reguły walidacji (np. długość ciągu, poprawność adresu e-mail itd.). Druga klasa to Validation, która zawiera w sobie informacje o polach i powiązanych z nimi regułami walidacji. W wyniku sprawdzenia metodą validate() czy check() (jak tam wolisz) otrzymujesz tylko prawda/fałsz - czy przekazane dane są prawidłowe. Jeśli nie dostęp do komunikatów o błędach powinieneś zrealizować osobną metodą np. errors(). Główną zaletą klasy Validation powinno być to, że jako regułę walidacji możesz podać dowolne wywołanie zwrotne (callback). Dzięki temu otrzymasz rozszerzalny komponent do sprawdzania poprawności każdych danych i na każdy sposób.
Darekxp
9.11.2012, 16:53:48
Głównie chodzi mi o to, że dla mnie np lepszym rozwiązaniem byłoby ustalić sobie w klasie dostępne metody określonych pól np: title, tags, text, price, date itd tak jak mam powyżej. Bo np i w dodawaniu newsa czy ogłoszenia, zawsze chce mieć tytuł wymagany o długości od 5 do 50 znaków. Edytując news czy ogłoszenie też odwołuję się do np metody title i wszystko mam sprawdzane tą metodą. A wg Waszych przykładów zawsze muszę ustalać od początku max długość stringu itd dla np pola title, nawet jeśli go mam w 10 różnych miejsach i ma mieć te same właściwości (jak sie mylę to mnie poprawcie;p). OOP uczę się od paru dni i staram się tworzyć kod pod własne potrzeby na próbach, błędach i przykładach, jak np walidacja, upload zdjęć itd, a że to początki OOP w moim przypadku to jest w nich wieleeee niedoskonałości.
Podsumowując:
- Czy jeśli potrzebuję sprawdzania pól title, tags, date, price itd w różnych miejsach jak newsy, ogłoszenia (dodawanie, edycja) trzymać się swojej wersji i ustalić z góry metody title, tags... i tylko się do nich później odwoływać, czy wykorzystywać Wasze wzory?
- Skoro nie używać echo w metodach, jak np do $error dobrać w OOP odpowiedni komunikat do danego pola (przykład: sprawdzam pole title, i gdzie trzymać komunikaty typu: Pole tytuł jest za długie, jest wymagane i jak je dopasować)?
Nie szedłbym w tym kierunku jaki prezentujesz IMO jest on mało wydajny, choćby do rozbudowy skryptu w przyszłości, po co pisać 40 razy ten sam fragment kodu, skoro można tylko raz.
Cytat(Darekxp @ 9.11.2012, 16:53:48 )

- Skoro nie używać echo w metodach, jak np do $error dobrać w OOP odpowiedni komunikat do danego pola (przykład: sprawdzam pole title, i gdzie trzymać komunikaty typu: Pole tytuł jest za długie, jest wymagane i jak je dopasować)?
class Validations
{
public function addValid{
if(!cokolwiek_gdy_zle){
$this->error['nazwa_pola_bledu'] = 'komunikat' // dodajesz komunikat do tablicy
}
}
public function getErrors{
return $this->error;
$o = new Validations;
$o->getErrors(); // zwraca tablice z błędami