Hey,
Ik probeer mijn PHP-code volgens het MVC-model te schrijven. Op dit moment stelt het niet veel voor; het controller-gedeelte is zelfs nog volledig functioneel ipv OO. Maar veel ervaring met MVC heb ik niet, laat staan in PHP. Maar voor een huidig project is deze aanpak nodig.
Ik probeer dus nu simpelweg een view, een model en een controller te scheiden. Op zich geen probleem, tot het op inputvalidatie aankomt. Blijkbaar is de beste methode deze validatie in de model uit te voeren. Na een beetje zoeken kwam ik op de volgende tutorial uit, welke me wel een goede aanpak lijkt:
https://www.firehed.net/mvc-model-data-validation
Dit lijkt me een eenvoudige manier om deze controles uit te voeren. Echter heb ik hier 2 bedenkingen:
1) In de controller gebruikt hij de $_POST-variabelen. Maar mag je er vanuitgaan dat deze bestaan? Indien het formulier correct is verzonden zullen deze gewoon bestaan (al dan niet leeg, maar dat is buiten de kwestie), maar wat als er iets misgaat met het verzenden? Of iemand probeert z'n eigen POST-data te versturen zonder dit formulier te gebruiken en $_POST['username'] bestaat niet?
Moet hier Überhaupt rekening mee gehouden worden? Zo ja, wat is hier de beste manier voor?
2) Laten we even stellen dat die save()-methode bij mij addUser() noemt en een INSERT-query uitvoert. Zijn validatieaanpak werkt hier wel, maar natuurlijk moet je eerst kijken of alle benodigde velden wel bestaan. Aangezien er magic methods gebruikt worden, is dit redelijk lastig, want je weet niet welke namen er in de controller gekozen zijn.
Een oplossing is in de addUser()-methode een array bij te houden met benodigde velden en te gaan controleren of deze bestaan:
Maar nu ben je ook verplicht in de controller deze veldnamen te gebruiken, waardoor de afhankelijkheid tussen de model en de controller te groot wordt. Volgens mij is zoiets een van de slechtere dingen die je kunt doen in een MVC-design.
Mijn eerste idee (en wat ik op dit moment ook doe) is gebruik maken van een aparte validatieklasse welke methodes als validateUsername(), validatePassword(), etc. bevat. Deze bevat ook een validateAdd()-methode welke er zo uiziet:
(De methode bevat nog meer methode-calls, maar dit is even een simpel voorbeeld)
Ook hier is volgens mij veel mis mee. Een methode dat een 10-tal andere methodes gaat oproepen op deze manier lijkt me geen goed design. Het grote probleem doet zich echter voor bij de validateEdit()-methode (je krijgt een formuliertje te zien waarin je gebruikersgegevens kunt wjzigen) omdat:
- De methode dat controleert of de username al in gebruik is, werkt niet meer aangezien je kan besluiten de naam niet te wijzigen. Bij zo'n controle zal de username inderdaad al bestaan, terwijl je deze helemaal niet wilt wijzigen. Oplossing: de originele username vergelijken met de nieuw ingevulde. Indien deze hetzelfde zijn, is deze controle niet nodig.
- Wachtwoorden: Deze moet je bij het wijzigen niet verplicht invullen (bij het toevoegen wel). Als ze wel zijn ingevuld, is controle nodig. MAAR als de validatie faalt moeten de ingevulde wachtwoorden wel terug naar de view gestuurd worden zodat de gebruiker deze niet opnieuw moet invullen.
- Gebruikerniveau's: Deze zijn enkel te wijzigen in specifieke omstandigheden.
Mijn huidige validateEdit()-methode werkt, maar deze durf ik niet posten. Enerzijds omdat ik dan uitgelachen wordt, anderzijds omdat ik de code zelf nog nauwelijks snap
Deze validator zou ik dan toevoegen aan de model en deze bij addUser() eerst gaan gebruiken. Opnieuw heb ik geen idee hoe ik dit het best aanpak (om de foutmeldingen te kunnen opvangen).
Dan zit ik nog met een tweede, kleiner probleempje, maar volgens mij moet ik me maar eerst focussen op het valideren van de user input.
Hoe pak je dit best aan? Volgens mij ben ik helemaal verkeerd bezig hiermee. Alle advies om dit te verbeteren is welkom.
Alvast bedankt!
Ik probeer mijn PHP-code volgens het MVC-model te schrijven. Op dit moment stelt het niet veel voor; het controller-gedeelte is zelfs nog volledig functioneel ipv OO. Maar veel ervaring met MVC heb ik niet, laat staan in PHP. Maar voor een huidig project is deze aanpak nodig.
Ik probeer dus nu simpelweg een view, een model en een controller te scheiden. Op zich geen probleem, tot het op inputvalidatie aankomt. Blijkbaar is de beste methode deze validatie in de model uit te voeren. Na een beetje zoeken kwam ik op de volgende tutorial uit, welke me wel een goede aanpak lijkt:
https://www.firehed.net/mvc-model-data-validation
Dit lijkt me een eenvoudige manier om deze controles uit te voeren. Echter heb ik hier 2 bedenkingen:
1) In de controller gebruikt hij de $_POST-variabelen. Maar mag je er vanuitgaan dat deze bestaan? Indien het formulier correct is verzonden zullen deze gewoon bestaan (al dan niet leeg, maar dat is buiten de kwestie), maar wat als er iets misgaat met het verzenden? Of iemand probeert z'n eigen POST-data te versturen zonder dit formulier te gebruiken en $_POST['username'] bestaat niet?
Moet hier Überhaupt rekening mee gehouden worden? Zo ja, wat is hier de beste manier voor?
2) Laten we even stellen dat die save()-methode bij mij addUser() noemt en een INSERT-query uitvoert. Zijn validatieaanpak werkt hier wel, maar natuurlijk moet je eerst kijken of alle benodigde velden wel bestaan. Aangezien er magic methods gebruikt worden, is dit redelijk lastig, want je weet niet welke namen er in de controller gekozen zijn.
Een oplossing is in de addUser()-methode een array bij te houden met benodigde velden en te gaan controleren of deze bestaan:
PHP:
1
2
3
4
5
6
7
8
9
10
| function addUser() { $fields = array("username", "password", "firstname"); foreach ($fields as $field) { if (!isset($this->data[$field])) return false; } return $this->db->execute("INSERT into blablabla"); } |
Maar nu ben je ook verplicht in de controller deze veldnamen te gebruiken, waardoor de afhankelijkheid tussen de model en de controller te groot wordt. Volgens mij is zoiets een van de slechtere dingen die je kunt doen in een MVC-design.
Mijn eerste idee (en wat ik op dit moment ook doe) is gebruik maken van een aparte validatieklasse welke methodes als validateUsername(), validatePassword(), etc. bevat. Deze bevat ook een validateAdd()-methode welke er zo uiziet:
PHP:
1
2
3
4
5
6
7
8
9
| public function validateAdd($username, $firstname, $password, $pass_confirm) { $this->message = ""; if (!$this->validateName($firstname)) $this->message .= "- Ongeldige voornaam.\n"; if (!$this->validateUsername($username)) $this->message .= "- Deze gebruikersnaam is ongeldig.\n"; if (!$this->validatePasswords($password, $pass_confirm)) $this->message .= "- Ongeldig wachtwoord.\n"; return empty($this->message); } |
(De methode bevat nog meer methode-calls, maar dit is even een simpel voorbeeld)
Ook hier is volgens mij veel mis mee. Een methode dat een 10-tal andere methodes gaat oproepen op deze manier lijkt me geen goed design. Het grote probleem doet zich echter voor bij de validateEdit()-methode (je krijgt een formuliertje te zien waarin je gebruikersgegevens kunt wjzigen) omdat:
- De methode dat controleert of de username al in gebruik is, werkt niet meer aangezien je kan besluiten de naam niet te wijzigen. Bij zo'n controle zal de username inderdaad al bestaan, terwijl je deze helemaal niet wilt wijzigen. Oplossing: de originele username vergelijken met de nieuw ingevulde. Indien deze hetzelfde zijn, is deze controle niet nodig.
- Wachtwoorden: Deze moet je bij het wijzigen niet verplicht invullen (bij het toevoegen wel). Als ze wel zijn ingevuld, is controle nodig. MAAR als de validatie faalt moeten de ingevulde wachtwoorden wel terug naar de view gestuurd worden zodat de gebruiker deze niet opnieuw moet invullen.
- Gebruikerniveau's: Deze zijn enkel te wijzigen in specifieke omstandigheden.
Mijn huidige validateEdit()-methode werkt, maar deze durf ik niet posten. Enerzijds omdat ik dan uitgelachen wordt, anderzijds omdat ik de code zelf nog nauwelijks snap

Deze validator zou ik dan toevoegen aan de model en deze bij addUser() eerst gaan gebruiken. Opnieuw heb ik geen idee hoe ik dit het best aanpak (om de foutmeldingen te kunnen opvangen).
Dan zit ik nog met een tweede, kleiner probleempje, maar volgens mij moet ik me maar eerst focussen op het valideren van de user input.
Hoe pak je dit best aan? Volgens mij ben ik helemaal verkeerd bezig hiermee. Alle advies om dit te verbeteren is welkom.
Alvast bedankt!