Exceptions of booleans?
Hallo,
Als je in OOP een form validatie maakt, met formulier klassen, InputElement klassen, InputRule klassen, etc. Is het dan beter om een fout ingevulde input component te verwerken met een exception, of met een functie die bijvoorbeeld true of false geeft?
Ik heb bijvoorbeeld een formulier klasse, daarin zet ik InputElements die in de formulier klasse worden opgeslagen. Dan heb je nog een inputValidator die het formulier op fout ingevulde velden controleert. Elk InputElement object in het Form object heeft een aantal InputRules in zich gekregen. Bijvoorbeeld een veld voor een emailadres heeft een InputRule object gekregen dat controleert of het emailadres echt is. Zo'n InputRule object heeft een functie validate() die nu true of false teruggeeft om aan te geven of aan die input regel wordt voldaan. Is het beter om dit dus met booleans te doen, of met exceptions?
Als je in OOP een form validatie maakt, met formulier klassen, InputElement klassen, InputRule klassen, etc. Is het dan beter om een fout ingevulde input component te verwerken met een exception, of met een functie die bijvoorbeeld true of false geeft?
Ik heb bijvoorbeeld een formulier klasse, daarin zet ik InputElements die in de formulier klasse worden opgeslagen. Dan heb je nog een inputValidator die het formulier op fout ingevulde velden controleert. Elk InputElement object in het Form object heeft een aantal InputRules in zich gekregen. Bijvoorbeeld een veld voor een emailadres heeft een InputRule object gekregen dat controleert of het emailadres echt is. Zo'n InputRule object heeft een functie validate() die nu true of false teruggeeft om aan te geven of aan die input regel wordt voldaan. Is het beter om dit dus met booleans te doen, of met exceptions?
>> Zo'n InputRule object heeft een functie validate() ...
Je gaat hier iets valideren. Daar kan een "geldig" of een "ongeldig" uitkomen. Voor jezelf kun je dit duidelijker maken door niet als functienaam validate() te gebruiken, maar isValid(). En dan heb je ook meteen antwoord op je vraag. IsValid? Ja of nee, ofwel true of false.
Exceptions zou ik persoonlijk vooral voorbehouden aan situaties die verkeerd kunnen gaan, bijvoorbeeld het niet tot stand kunnen komen van een databaseverbinding.
Je gaat hier iets valideren. Daar kan een "geldig" of een "ongeldig" uitkomen. Voor jezelf kun je dit duidelijker maken door niet als functienaam validate() te gebruiken, maar isValid(). En dan heb je ook meteen antwoord op je vraag. IsValid? Ja of nee, ofwel true of false.
Exceptions zou ik persoonlijk vooral voorbehouden aan situaties die verkeerd kunnen gaan, bijvoorbeeld het niet tot stand kunnen komen van een databaseverbinding.
Exceptions betekent letterlijk uitzonderingen en zijn dan ook bedoelt voor wanneer een applicatie niet meer verder zijn taak kan uitvoeren. Bekende voorbeelden zijn: out of memory, division by zero, connection errors etc. Daarnaast biedt PHP de mogelijkheid om eigen exceptions te genereren. Hierdoor zijn er eigenlijk twee stromingen ontstaan: de eerste gebruikt geen custom exceptions en de tweede om de haverklap. Maar bij het controleren van een invoerveld is feitelijk helemaal geen sprake van exceptions. Een invoerveld is goed of niet goed ingevuld. Dus in die zin kan een TRUE of FALSE voldoende zijn. Echter komen we wel op een ander punt wanneer we de gebruiker een foutmelding willen tonen in de trant van "U heeft geen geldig mailadres ingevuld.". Hierbij kun je dan nog bedenken dat een dergelijke foutmelding soms in het nederlands maar soms ook in een andere taal gegeven dient te worden :-). Reden genoeg om aan aantal zaken zorgvuldig gescheiden te houden van elkaar.
Zover mij bekend zie je dan in de OOP systemen meestal dat een formfield object geen, één of meerdere validationRules toegewezen krijgt. Jouw email veld zou dan een NotEmptyValidationRule kunnen krijgen en een ValidMailaddressValidationRule bijvoorbeeld. Naast een IsValid method zou je wellicht een getErrorMessage method kunnen maken die ingeval van validatie fouten wordt aangeroepen om een keurige foutmelding te tonen.
Toevoeging op 01/02/2015 14:27:03:
Verder is de ValidationRule ook typisch zo een class waarbij je gebruik gaat maken van een interface
Zover mij bekend zie je dan in de OOP systemen meestal dat een formfield object geen, één of meerdere validationRules toegewezen krijgt. Jouw email veld zou dan een NotEmptyValidationRule kunnen krijgen en een ValidMailaddressValidationRule bijvoorbeeld. Naast een IsValid method zou je wellicht een getErrorMessage method kunnen maken die ingeval van validatie fouten wordt aangeroepen om een keurige foutmelding te tonen.
Toevoeging op 01/02/2015 14:27:03:
Verder is de ValidationRule ook typisch zo een class waarbij je gebruik gaat maken van een interface
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
interface iValidationRule
{
function __construct(\FormField $formfield);
public function isValid();
public function getErrorMessage();
}
class ValidationRule implements iValidationRule
{
protected $formField;
public function __construct(\FormField $formfield) {
$this->formField = $formfield;
}
public function isValid()
{
return TRUE;
}
public function getErrorMessage()
{
return NULL;
}
}
class NotEmptyValidationRule extends ValidationRule
{
public function isValid()
{
if(strlen($this->formField->getContent()) > 0)
return TRUE;
return FALSE;
}
public function getErrorMessage()
{
return $GLOBALS['translater']->getTranslation('NotEmptyMessage');
}
}
?>
interface iValidationRule
{
function __construct(\FormField $formfield);
public function isValid();
public function getErrorMessage();
}
class ValidationRule implements iValidationRule
{
protected $formField;
public function __construct(\FormField $formfield) {
$this->formField = $formfield;
}
public function isValid()
{
return TRUE;
}
public function getErrorMessage()
{
return NULL;
}
}
class NotEmptyValidationRule extends ValidationRule
{
public function isValid()
{
if(strlen($this->formField->getContent()) > 0)
return TRUE;
return FALSE;
}
public function getErrorMessage()
{
return $GLOBALS['translater']->getTranslation('NotEmptyMessage');
}
}
?>
Gewijzigd op 01/02/2015 14:52:21 door Frank Nietbelangrijk
Nog even een vraagje.
ik heb dus ook objecten voor de formulier elementen waar ik de InputRules aan toewijs, maar als ik de value van zo'n element wil hebben, dan moet ik gebruik maken van de $_POST of $_GET global, maar het is vanzelfsprekend dat je dit niet doet in OOP, normaal haal je dit soort dingen uit het Request object.
Ik heb dus ook een Form object waar ik de input objecten aan toevoeg. Het formulier heeft een submit function die als parameter het Request object bevat. Maar wanneer ga ik uit dat request object de waardes halen van POST en GET, in het Form object en dan in de submit function de input objecten vullen met die waarde, en dan validaren? Of een andere manier?
ik heb dus ook objecten voor de formulier elementen waar ik de InputRules aan toewijs, maar als ik de value van zo'n element wil hebben, dan moet ik gebruik maken van de $_POST of $_GET global, maar het is vanzelfsprekend dat je dit niet doet in OOP, normaal haal je dit soort dingen uit het Request object.
Ik heb dus ook een Form object waar ik de input objecten aan toevoeg. Het formulier heeft een submit function die als parameter het Request object bevat. Maar wanneer ga ik uit dat request object de waardes halen van POST en GET, in het Form object en dan in de submit function de input objecten vullen met die waarde, en dan validaren? Of een andere manier?
>> normaal haal je dit soort dingen uit het Request object.
Precies.
>> Maar wanneer ga ik uit dat request object de waardes halen van POST en GET
Dit doe je in een speciale method van je FormBuilder:
In je controller wil je alleen iets als dit hebben:
bron: http://symfony.com/doc/current/book/forms.html
even de structuur (gedeeltelijk)
Precies.
>> Maar wanneer ga ik uit dat request object de waardes halen van POST en GET
Dit doe je in een speciale method van je FormBuilder:
In je controller wil je alleen iets als dit hebben:
bron: http://symfony.com/doc/current/book/forms.html
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
public function newAction(Request $request)
{
$form = $this->createFormBuilder()
->add('task', 'text')
->add('dueDate', 'date')
->add('save', 'submit', array('label' => 'Create Task'))
->getForm();
$form->handleRequest($request);
if ($form->isValid()) {
// perform some action, such as saving the task to the database
}
}?>
public function newAction(Request $request)
{
$form = $this->createFormBuilder()
->add('task', 'text')
->add('dueDate', 'date')
->add('save', 'submit', array('label' => 'Create Task'))
->getForm();
$form->handleRequest($request);
if ($form->isValid()) {
// perform some action, such as saving the task to the database
}
}?>
even de structuur (gedeeltelijk)
>> Ik heb dus ook een Form object waar ik de input objecten aan toevoeg.
Je kunt dit in MVC-stijl opsplitsen: het formulier is een view (V) en een controller (C) plaatst daarin data die uit een model (M) komen. De form controller kan in dit geval nieuwe data uit een request-object halen, maar er zijn ook situaties waarin je bijvoorbeeld eerder ingevulde data uit een database wilt hergebruiken. Dat gaat allemaal aan het formulier (de view) voorbij: de controller regelt dit.
Het formulier doet bijvoorbeeld alleen echo $voornaam en de controller bepaalt hoe die $voornaam wordt gevuld.
>> Maar wanneer ga ik uit dat request object de waardes halen van POST en GET, in het Form object en dan in de submit function de input objecten vullen met die waarde, en dan validaren? Of een andere manier?
Je kunt, om te beginnen, niet alles overlaten aan individuele objecten: je hebt ook altijd een applicatie die de objecten onderling verbindt en laat samenwerken. Aangezien je altijd maar één request beantwoord, laat je een front controller (index.php) dat één keer aanmaken. Hiervoor wordt ook vaak een registry gebruikt die naast $_GET en $_POST bijvoorbeeld nog $_SERVER afhandelt. Met andere woorden: dat voor het verwerken van een request meerdere objecten in een specifieke volgorde nodig zijn (bijvoorbeeld request -> validator -> controller -> view), bepaal je op het niveau van de applicatie.
Je kunt dit in MVC-stijl opsplitsen: het formulier is een view (V) en een controller (C) plaatst daarin data die uit een model (M) komen. De form controller kan in dit geval nieuwe data uit een request-object halen, maar er zijn ook situaties waarin je bijvoorbeeld eerder ingevulde data uit een database wilt hergebruiken. Dat gaat allemaal aan het formulier (de view) voorbij: de controller regelt dit.
Het formulier doet bijvoorbeeld alleen echo $voornaam en de controller bepaalt hoe die $voornaam wordt gevuld.
>> Maar wanneer ga ik uit dat request object de waardes halen van POST en GET, in het Form object en dan in de submit function de input objecten vullen met die waarde, en dan validaren? Of een andere manier?
Je kunt, om te beginnen, niet alles overlaten aan individuele objecten: je hebt ook altijd een applicatie die de objecten onderling verbindt en laat samenwerken. Aangezien je altijd maar één request beantwoord, laat je een front controller (index.php) dat één keer aanmaken. Hiervoor wordt ook vaak een registry gebruikt die naast $_GET en $_POST bijvoorbeeld nog $_SERVER afhandelt. Met andere woorden: dat voor het verwerken van een request meerdere objecten in een specifieke volgorde nodig zijn (bijvoorbeeld request -> validator -> controller -> view), bepaal je op het niveau van de applicatie.




