Exceptions of booleans?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mark Hogeveen

Mark Hogeveen

01/02/2015 13:21:56
Quote Anchor link
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?
 
PHP hulp

PHP hulp

21/11/2024 16:16:57
 
Ozzie PHP

Ozzie PHP

01/02/2015 13:30:28
Quote Anchor link
>> 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.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

01/02/2015 14:08:15
Quote Anchor link
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

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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');
    }
}


?>
Gewijzigd op 01/02/2015 14:52:21 door Frank Nietbelangrijk
 
Mark Hogeveen

Mark Hogeveen

03/02/2015 10:15:18
Quote Anchor link
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?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

03/02/2015 10:31:38
Quote Anchor link
>> 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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$form
->handleRequest($request);
?>


In je controller wil je alleen iets als dit hebben:
bron: http://symfony.com/doc/current/book/forms.html
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
    }
}
?>


even de structuur (gedeeltelijk)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FormBuilder
   |
   |----FormField
   |        |
   |        |----Label
   |        |----Name
   |        |----Value
   |        |----Option(s)
   |        |----ValidationRule(s)
   |
   |----FormField
   |        |
   |        |----Label
   |        |----Name
   |        |----Value
   |        |----Option(s)
   |        |----ValidationRule(s)
   |
 
Ward van der Put
Moderator

Ward van der Put

03/02/2015 10:51:25
Quote Anchor link
>> 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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.