[OOP] MVC model controller
Een vraagje ... als ik op internet rondkijk dan zie ik dat er verschillende interpretaties zijn van het MVC-model. En dan doel ik met name op de relatie tussen controller, model en view.
Zo zie je op Wikipedia een afbeelding waar model en view met elkaar communiceren.
https://nl.wikipedia.org/wiki/Model-view-controller-model
Op de onderstaande pagina zie je echter een afbeelding waar dat juist niet het geval is. Hier praat de controller met het model en de view, maar hebben het model en de view geen weet van elkaar.
https://www.quora.com/What-is-the-difference-between-the-OOP-object-oriented-programming-concept-and-the-MVC-model%E2%80%93view%E2%80%93controller-concept
Deze laatste manier is hoe ik zelf ook tegen het MVC-model aankijk. De controller vangt het request op, praat met het model om data op te halen en stuurt vervolgens de juiste gegevens naar de view.
Er is echter 1 ding wat ik me afvraag.
Is het model uitsluitend bedoeld om data op te halen? Of mag er ook 'logica' in zitten?
Een heel simpel voorbeeldje ...
Een website met films moet aanbevolen films tonen voor ingelogde bezoekers. Voor iemand van 12 (een kind) moeten andere films worden getoond dan voor iemand van 25.
Maar waar zit nu de logica ... in de controller of in het model?
Stuurt de controller als de leeftijd jonger is dan x jaar een verzoek naar het model om aanbevolen 'kinderfilms' op te halen? Of stuurt de controller een generiek verzoek naar het model om aanbevolen films op te halen, en bepaalt het model zelf op basis van de leeftijd welke films hij ophaalt? Wie is zeg maar 'leading' in dat proces. Zijn daar richtlijnen voor?
Toevoeging op 26/02/2019 10:57:51:
Misschien nog een tweede voorbeeldje ...
Stel we hebben een loginpagina. Iemand voert z'n gebruikersnaam en wachtwoord in. Wie voert dan vervolgens de controle uit? Verstuurt de controller een verzoek naar het model om het wachtwoord (hash) op te halen, en kijkt de controller vervolgens zelf of dat overeenkomt met het opgegeven wachtwoord? Of stuurt de controller enkel een verzoek 'controleer wachtwoord' naar het model, en voert het model de gehele controle zelf uit?
Een film is namelijk een ander model dan een lijst met films. De controller stuurt in dit geval het model voor een lijst of collectie met films aan, niet dat voor een film.
(Ik gebruik zelf overigens ook liever de tweede interpretatie van het MVC-pattern omdat het in PHP meestal geen zin heeft een view rechtstreeks aan een model te hangen zonder tussenkomst van een controller. Het kán wel, maar het heeft weinig praktische toepassingen.)
Ik snap wat je bedoelt :-)
Maar de vraag blijft hetzelfde ... wat vindt waar plaats. Volgens mij (correct me if I'm wrong) zou de controller niet ZELF rechtstreeks die lijst met films moeten ophalen, maar verloopt dat via het model dat bij die controller hoort. Dus de controller zegt tegen het model dat het model (via een ander model) een lijst met films moet ophalen en moet teruggeven aan de controller. Tot zover klopt het denk ik nog?
Maar nu dus de vraag ... in het voorbeeldje met de leeftijd ... zegt de controller tegen het model "geef me films voor iemand van 12"? Of zegt de controller "geef me een lijst met films" en bepaalt het model welke films het teruggeeft?
class AdultMovies extends Movies
De controller hoeft nu niet te weten wat de criteria zijn die het model gebruikt om tot een bepaalde samenstelling van films te komen. Dan kan bijvoorbeeld een WHERE ages >= 18 zijn, maar ook een set van geheel andere criteria (bijvoorbeeld een rating volgens een of ander reviewsysteem).
Heb je omgekeerd echter een applicatie nodig die juist wél gericht op specifieke leeftijden kan zoeken, dan wordt de leeftijd een expliciet argument waarmee de controller het model moet kunnen aansturen.
En het andere voorbeeldje wat ik gaf wat betreft inloggen?
Dus een gebruiker logt in. De LoginController ontvangt de ingevoerde gebruikersnaam en wachtwoord. Gaat de controller nu zelf de controle uitvoeren of het wachtwoord klopt? Of stuurt hij de gebruikersnaam en wachtwoord naar het model en voert het model de controle uit?
Hoe logt de gebruiker in? Via een een login formulier of een api of misschien wel een via de commandline (beheerder tools) ?
Welke rol heeft jantje? wat mag jantje wel en niet?
Welke veiligheidsmaatregelen zijn van kracht? (misschien wel 2-step-verification)
Welk algoritme wordt gebruikt bij het hashen van de wachtwoorden?
Heb ik het antwoord al gegeven? :p
Nou, je hebt in ieder geval een boel vragen gesteld :D
Maar ik neem aan dat je wil zeggen dat het in het model thuishoort omdat het logica betreft. Correct?
Vergeet niet dat een model een IDEE is, het is een leidraad bij het op een bepaalde manier inrichten van een applicatie. Hierbij kun je dus rustig beslissingen nemen om dingen anders in te richten zolang je de hoofdlijnen maar in grote lijnen aanhoudt.
Het heeft geen enkele zin om het MVC-model heel strict te volgen omdat dit mede in kan houden dat je allemaal virtuele muren optrekt om bepaalde onderdelen, of dat deze compleet onbereikbaar voor elkaar zijn op het moment dat dat wel eens verdomd handig geweest had kunnen zijn.
Je moet dit soort ontwerpbeslissingen nemen op grond van wat handig en praktisch is, in plaats van jezelf in de blubber vastrijden enkel en alleen om een soort van ideaalbeeld van een methodiek na te streven, die je verder echt helemaal niets oplevert.
Ik heb dit soort "discussies" al zo vaak gezien op het internet, en elke MVC-zealot predikt daarbij dat zijn geloof het ware is...
Wie zegt dat die precieze aanpak (of welke specifieke MVC-aanpak dan ook die ergens uit de doeken wordt gedaan) de "beste" is voor jouw applicatie? :/
Gewijzigd op 26/02/2019 21:37:53 door Thomas van den Heuvel
Denk breder:
- een security class die zich gaat gedragen naar de instellingen die gedaan zijn.
- meerdere password encoders (sha, bcrypt, ...) waarvan er één gebruikt wordt per Authenticator (één Authenticator zou een LoginFormAuthenticator kunnen zijn)
- een Firewall die bepaalt wat er afgeschermd moet worden
- Authorization: Wie is er gemachtigd om het gevraagde te mogen zien/bewerken/verwijderen
Als je zondag niets te doen hebt zou je dit eens kunnen lezen
@Thomas:
Ja, snap wel wat je zegt. Het is inderdaad voor meerdere interpretaties vatbaar. Ik las ook ergens dat je de controllers zo klein mogelijk moet houden (ook wat Frank zegt) en models zo groot mogelijk. Volgens mij stond er zoiets als "use skinny controllers and fat models". Ik denk dat ik de controller een beetje moet zien als een soort dirigent die met z'n stokje aanwijst wat er moet gebeuren, en het model als het orkest dat de muziek produceert :-)
En hoe klinkt die muziek dan :].
Ik ben nog de juiste bandleden bij elkaar aan het rapen ;-) En ergens heel in de verte beginnen er wat trompetten te blazen :)
https://www.slideshare.net/syedhamin/thin-controllers-fat-models-how-to-write-better-code
Slide 13 ;-)
Slide 13 ;-)
Haha ... nice! :-)))