Door
Lord Gaga
op 25-10-2013 22:29
gewijzigd op 25-10-2013 22:29
1.282 views
Hallo,
Omdat ik mijn website nu probeer te maken met MVC, wil ik alle validatie laten gebeuren d.m.v een validatie klasse. Tot nu toe heb ik het volgende:
<?php
class Validate
{
public function __construct(){}
public function minLength($string, $length)
{
if (strlen($string) < $length)
{
return false;
}
else
{
return true;
}
}
public function maxLength($string, $length)
{
if (strlen($string) > $length)
{
return false;
}
else
{
return true;
}
}
}
?>
Nu wil ik hier dus o.a. een method maken die de gebruikersnaam controleert, maar houdt dit ook in dat er wordt gecontroleerd of de gebruikersnaam al bestaat? En zo ja; hoe pas ik dit dan toe, want dan zou dit betekenen dat ik deze klasse alleen kan aanroepen in de model (aangezien het een database connectie nodig heeft).
En beide zou ik niet doen. Op deze manier is het gewoon procedurele code verpakt in een class. Wat het gebruik van objecten nu zo handig maakt is dat je de objecten zelf verantwoordelijk maakt voor hun eigen stukje. In dit geval vraag je alleen of het object alsjeblieft kan checken of een string niet korten of langer is dan een willekeurige waarde. Als je class zelf weet wat de eisen zijn (op basis van bijvoorbeeld geinjecteerde configuratie instellingen), dan wordt het pas interessant, want dan hoeft een ander object dat niet meer te weten.
<?php
class Validator{
private minLength;
private MaxLength;
private $lastError;
public function __construct( $min = 0, $max = 16 ){
$this->minLength = $min;
$this->maxLength = $max;
$this->lastError = '';
}
public function validate( $username ){
if ( $this->minLength > -1 && strlen( $username ) < $this->minLength ){
$this->lastError = 'Username too short';
return false;
}
if ( $this->maxLength > -1 && strlen( $username ) > $this->maxLength ){
$this->lastError = 'Username too long';
return false;
}
//no problem found
return true;
}
public function getLastError(){
return $this->lastError;
}
}
?>
En beide zou ik niet doen. Op deze manier is het gewoon procedurele code verpakt in een class. Wat het gebruik van objecten nu zo handig maakt is dat je de objecten zelf verantwoordelijk maakt voor hun eigen stukje. In dit geval vraag je alleen of het object alsjeblieft kan checken of een string niet korten of langer is dan een willekeurige waarde. Als je class zelf weet wat de eisen zijn (op basis van bijvoorbeeld geinjecteerde configuratie instellingen), dan wordt het pas interessant, want dan hoeft een ander object dat niet meer te weten.
<?php
class Validator{
private minLength;
private MaxLength;
private $lastError;
public function __construct( $min = 0, $max = 16 ){
$this->minLength = $min;
$this->maxLength = $max;
$this->lastError = '';
}
public function validate( $username ){
if ( $this->minLength > -1 && strlen( $username ) < $this->minLength ){
$this->lastError = 'Username too short';
return false;
}
if ( $this->maxLength > -1 && strlen( $username ) > $this->maxLength ){
$this->lastError = 'Username too long';
return false;
}
//no problem found
return true;
}
public function getLastError(){
return $this->lastError;
}
}
?>
Maar dit werkt nu dus alleen bij een gebruikersnaam? Deze class was meer bedoeld ter validatie van meerdere strings. Stel dat ik ergens wil checken of de input een string is, dan zou ik bijvoorbeeld dit willen doen:
$form = new Form();
$form->post('username')->validate('isset')->validate('minLength', 3)->validate('maxLength', 25)->validate('string');
$form->submit();
(Waarbij de method 'validate' dan weer Validate::minLength($_POST['username'], 3); o.i.d. aanroept)
En nu wil ik dus graag weten hoe ik dit moet doen met het controleren of de gebruikersnaam al bestaat, want hierbij is een database connectie nodig en die is er alleen in de model.
Door een referentie van je model mee te geven in je klasse?
Oké, en kan ik bij het valideren van de gebruikersnaam het best een een nieuwe method aanmaken die controleert op: lengte, of het al bestaat, geldige karakters, etc.. of kan ik deze het best als losse methods aanroepen?
$form->post('username')->validate('username');
// of
$form->post('username')->validate('minLength', 3)->validate('maxLength', 25)->etc..;