De inleiding tot het MVC model

Gestart doorRogier16 reacties365 weergaven

17 berichten · pagina 1 van 2

Rogier

Lid · Topicstarter

Berichten
6.485
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Inleiding in het MVC Pattern

Inleiding
Hier gaan de meesten van jullie iets leren. Echter zijn er ook super slimme leden op one2xs die dit allang weten. Dan kan je het alsnog doorlezen om feedback te geven.

Ik ga het MVC Pattern hier behandelen aan de hand van voorbeelden uit PHP. PHP is zeker niet de enige taal waar MVC wordt toegepast, RoR is een framework in Ruby waar het ook veel wordt gebruikt.
Omdat de meeste leden hier PHP aan het leren zijn, vond ik het handig om de voorbeelden in PHP te geven.

In dit topic leer je niet programmeren, je krijgt een inleiding naar een in mijn ogen betere manier van programmeren.

Ik schrijft deze tutorial omdat ik de kwaliteit van programmeurs op one2xs omhoog wil halen, het niet slecht! Maar van elkaar kunnen we leren, en het MVC Patterns is een belangrijk en voor een aantal leden denk ik moeilijk onderwerp.

Wat is het MVC Pattern
Het is MVC Pattern is een manier van programmeren, of nog beter, een manier van je code scheiden. Het komt erop neer dat de code die je schrijft gescheiden wordt in 3 onderdelen.
> Model
> View
> Controller

Elk van deze onderdelen komen los nog aanbod in deze tutorial.

MVC is ook Object Orientated Programming (OOP). Alles is OOP, dit gaat vrijwel automatisch als je gebruikt maakt van het MVC Pattern.

Voor PHP zijn een aantal grote MVC Frameworks. Elk framework is net anders, heel erg lightweight (CodeIgnitor) of juist heel erg uitgebreid (Zend).

Waarom MVC?
Dat is een veel voorkomende en ook zeker goede vraag. Ik had in eerste instantie het gevoel "Sjezus wat een hoop zinloze code". Maar je werkt je er doorheen en merkt dat je code zo ongelofelijk veel mooier wordt.

Zonder MVC is je code in 99% van de gevallen gelijk aan een bord spaghetti. Dit is niet erg, zolang jij de enige bent die eraan programmeert. Maarja we snappen allemaal wel dat er een moment komt waarop je met teams gaat werken. Of het moment dat je een website verkoopt, en de koper wil zijn geld terug omdat de code bagger is.

Eigenlijk is het MVC model in het leven geroepen om onderscheid te maken tussen 2 typen programmeurs.

1- De kwalitatieve programmeur, die nadenkt waarom hij iets programmeert. Hij denkt dieper na over de architectuur van een applicatie.
2- De Het-Werkt-Dus-Het-Werkt programmeur, die low-budget websites maakt. Aan grote applicaties moet je niet beginnen.

Optie 2 is waar de meesten op one2xs zich nu bevinden, ik ga ervan uit dat jullie allemaal straks een grote website willen hebben. Dat éne idee uitwerken. Dan moet je jezelf trainen om optie 1 te worden.

MVC

Model

Een model is informatieverwerking. In een model haal je data op, je update data, je verwijdert data en je maakt data aan.
Belangrijk is dat in je model geen logica komt te staan. Je maakt dus een functie die maar één ding doet. Informatie verwerken. In de model mag geen regel html voorkomen.

Voorbeeld van een model class (in het Zend Framework)
Spoiler tonen
[COLOR= #0000BB]<?php[/COLOR]

[COLOR= #FF8000]/**
 * @name Users
 * @version 1.0
 * @author Rogier fischer
 */[/COLOR]

[URL="http://www.php.net/class"]class[/URL] Model_DbTable_Users extends Zend_Db_Table_Abstract [COLOR= #007700]{[/COLOR]

    [URL="http://www.php.net/protected"]protected[/URL] [COLOR= #0000BB]$_name[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #DD0000]users[/COLOR][COLOR= #007700];[/COLOR]
    [URL="http://www.php.net/protected"]protected[/URL] [COLOR= #0000BB]$_primary[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #DD0000]users_id[/COLOR][COLOR= #007700];[/COLOR]
    [URL="http://www.php.net/protected"]protected[/URL] [COLOR= #0000BB]$_rowClass[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #DD0000]Model_Row_User[/COLOR][COLOR= #007700];[/COLOR]
    
    [COLOR= #FF8000]/**
     * @return User | false
     * false = User not found
     * @param string $email
     * @name get user by email
     * @author Rogier Fischer
     * @version 1.0
     */[/COLOR]
    [URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] getUserByEmail[COLOR= #007700]([/COLOR][COLOR= #0000BB]$email[/COLOR][COLOR= #007700]){[/COLOR]
        [COLOR= #0000BB]$select[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]select[COLOR= #007700]();[/COLOR]
        [COLOR= #0000BB]$select[/COLOR][COLOR= #007700]->[/COLOR]where[COLOR= #007700]([/COLOR][COLOR= #DD0000]users_email = ?[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$email[/COLOR][COLOR= #007700]);[/COLOR]
    
        [COLOR= #0000BB]$user[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]fetchRow[COLOR= #007700]([/COLOR][COLOR= #0000BB]$select[/COLOR][COLOR= #007700]);[/COLOR]
    
        [URL="http://www.php.net/return"]return[/URL] [COLOR= #007700]([/COLOR][COLOR= #0000BB]$user[/COLOR][COLOR= #007700]) ?[/COLOR] [COLOR= #0000BB]$user[/COLOR] [COLOR= #007700]:[/COLOR] false[COLOR= #007700];
        
    }
    
    
}[/COLOR]
Zoals je ziet doe ik helemaal niets met de data die ik uitlees, alles wat de data die ik ophaal manipuleert gebeurt in de controller.

Controller

Een controller doet werkt als volgt:

1) hij ontvangt data van de model
2) hij manipuleert de data
3) hij verstuur de data naar de view

Een controller kan je dus ook omschrijven als de connectie tussen het systeem en zijn gebruikers. In de controller mag bij voorkeur geen html en/of "echos" voorkomen. Dit verschilt alleen per framework.

Elk framework werkt weer anders, ik geef hier wederom een voorbeeld van een controller class bij het Zend Framework.
Bij zend is je controller opgebouwd in Actions. Elke Action representeert een view. Je kan dus 1 controller class met 20 views hebben.
Spoiler tonen
[COLOR= #0000BB]<?php[/COLOR]
[COLOR= #FF8000]/**
 * @author Rogier Fischer
 * @name User Controller
 * @version 0.1
 */[/COLOR]

[URL="http://www.php.net/class"]class[/URL] UserController extends Zend_Controller_Action
[COLOR= #007700]{[/COLOR]
    [URL="http://www.php.net/private"]private[/URL] [COLOR= #0000BB]$auth[/COLOR][COLOR= #007700];[/COLOR]

    [COLOR= #FF8000]/**
     * Constructor
     * @see Zend_Controller_Action::init()
     */[/COLOR]
    [URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] init[COLOR= #007700](){[/COLOR]
        [COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]auth [COLOR= #007700]=[/COLOR] Zend_Auth[COLOR= #007700]::[/COLOR]getInstance[COLOR= #007700](); 
    }[/COLOR]
    
    [COLOR= #FF8000]/**
     * @name register
     * @author Rogier Fischer
     * @version 1.0
     */[/COLOR]
    [URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] registerAction[COLOR= #007700]() {[/COLOR]
        [URL="http://www.php.net/if"]if[/URL][COLOR= #007700](![/COLOR][COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]auth[COLOR= #007700]->[/COLOR]hasIdentity[COLOR= #007700]()) {[/COLOR] [COLOR= #FF8000]// is er ingelogd?[/COLOR]
            [COLOR= #0000BB]$formRegister[/COLOR] [COLOR= #007700]= new[/COLOR] Form_Register[COLOR= #007700]();[/COLOR] [COLOR= #FF8000]// in Zend maak je formulieren d.m.v. van een class, in die class geef je de voorwaarden waar een veld aan moet voldoen.[/COLOR]
            [COLOR= #0000BB]$registerComplete[/COLOR] [COLOR= #007700]=[/COLOR] false[COLOR= #007700];[/COLOR]
                    
            [URL="http://www.php.net/if"]if[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]getRequest[COLOR= #007700]()->[/COLOR]isPost[COLOR= #007700]() && ![/COLOR][COLOR= #0000BB]$formRegister[/COLOR][COLOR= #007700]->[/COLOR]isValid[COLOR= #007700]([/COLOR][COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]getRequest[COLOR= #007700]()->[/COLOR]getPost[COLOR= #007700]())) {[/COLOR]
                [COLOR= #0000BB]$formRegister[/COLOR][COLOR= #007700]->[/COLOR]populate[COLOR= #007700]([/COLOR][COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]getRequest[COLOR= #007700]()->[/COLOR]getPost[COLOR= #007700]());[/COLOR]
                [COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]view[COLOR= #007700]->[/COLOR]formRegister [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]$formRegister[/COLOR][COLOR= #007700];
            }[/COLOR] 
            [URL="http://www.php.net/elseif"]elseif[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]getRequest[COLOR= #007700]()->[/COLOR]isPost[COLOR= #007700]() &&[/COLOR] [COLOR= #0000BB]$formRegister[/COLOR][COLOR= #007700]->[/COLOR]isValid[COLOR= #007700]([/COLOR][COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]getRequest[COLOR= #007700]()->[/COLOR]getPost[COLOR= #007700]())) {[/COLOR]
                [COLOR= #FF8000]// data is goed [/COLOR]
                [COLOR= #0000BB]$registerComplete[/COLOR] [COLOR= #007700]=[/COLOR] true[COLOR= #007700];[/COLOR]
                [COLOR= #0000BB]$modelUsers[/COLOR] [COLOR= #007700]= new[/COLOR] Model_DbTable_Users[COLOR= #007700]();[/COLOR]
    
                [COLOR= #0000BB]$post[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]getRequest[COLOR= #007700]()->[/COLOR]getPost[COLOR= #007700]();[/COLOR]
    
                [COLOR= #FF8000]// save user[/COLOR]
                [COLOR= #0000BB]$rowUser[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]$modelUsers[/COLOR][COLOR= #007700]->[/COLOR]createRow[COLOR= #007700]([/COLOR][COLOR= #0000BB]$post[/COLOR][COLOR= #007700]);[/COLOR]
                [COLOR= #0000BB]$rowUser[/COLOR][COLOR= #007700]->[/COLOR]setPassword[COLOR= #007700]([/COLOR][COLOR= #0000BB]$post[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]password[/COLOR][COLOR= #007700]]);[/COLOR]
                [COLOR= #0000BB]$rowUser[/COLOR][COLOR= #007700]->[/COLOR]save[COLOR= #007700]();
                        
            }[/COLOR] 
            [URL="http://www.php.net/else"]else[/URL] [COLOR= #007700]{[/COLOR]
                [COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]view[COLOR= #007700]->[/COLOR]formRegister [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]$formRegister[/COLOR][COLOR= #007700];
            }[/COLOR]
    
            [COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]view[COLOR= #007700]->[/COLOR]registerComplete [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]$registerComplete[/COLOR][COLOR= #007700];
        }[/COLOR] 
        [URL="http://www.php.net/else"]else[/URL] [COLOR= #007700]{[/COLOR]
            [COLOR= #FF8000]//User already loggedin[/COLOR]
        [COLOR= #007700]}
    }
}[/COLOR]
De view

De view is een gewoon een pagina met html. De user ziet de view. Elke view heeft een action. Over het algemeen is een view door een controller verbonden aan een model. Sommige views hebben echter geen model nodig.

In de view probeer je de hoeveelheid php tot een absoluut minimum te houden.

Dit voorbeeld hoort bij bovenstaande controller met registerAction.
Spoiler tonen
<div class="section">
    <div class="box">
        <div class="title">
            Registreer
            <span class="hide"></span>
        </div>
        <div class="content">
            <div style="width:50%">
                [COLOR= #0000BB]<?php[/COLOR]
                    [URL="http://www.php.net/if"]if[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]registerComplete[COLOR= #007700]) {[/COLOR]
                        [URL="http://www.php.net/echo"]echo[/URL] [COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]message[COLOR= #007700];
                    }[/COLOR]
                    [URL="http://www.php.net/else"]else[/URL] [COLOR= #007700]{[/COLOR]
                        [URL="http://www.php.net/echo"]echo[/URL] [COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]formRegister[COLOR= #007700];
                    }[/COLOR]
                ?>
            </div>
        </div>
    </div>
</div>
Frameworks

Voor een tabel met eigenschappen en verschillende frameworks vergeleken klik hier

Zend
Zend is een heavyweight zeer uitgebreid framework. Je kan er vrijwel alles mee. Ik heb het zelf al in meerdere applicaties gebruikt en het bevalt me heel erg goed!
Hij doet vrijwel alle beveiligingen automatisch en vooral voor het verwerken van formulieren werkt het geweldig.

CodeIgnitor
Hier werkte ik vroeger mee, het is een stuk makkelijker dan Zend maar na verloop van tijd werd ik teveel beperkt door het gebrek aan een aantal functionaliteiten. Voor kleine websites is het nog steeds mijn keuze!

Andere frameworks heb ik niet vaak genoeg gebruikt om over te kunnen oordelen.

Slot

Er valt nog zo veeeel meer te vertellen over het MVC Pattern, maar hé dit is maar de inleiding.

Hecht absoluut niet teveel waarde aan de voorbeelden, want deze zijn echt heel erg zend specifiek. Het gaat puur om de indruk van MVC.

Als je nog vragen hebt, pm of hier in het topic!
0
Berichten
1.544
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Ik zie al een foutje yummie Ruby on Rails is het framework en Ruby is de programmeer taal smile Verder wil ik aanraden om Laravel erbij te zetten als ander framework en misschien FuelPHP ook. (Persoonlijk ben ik meer voor Laravel, maar dat is een persoonlijke keuze) Ze zijn voor iets hoger niveau dan CodeIgniter, maar raad het zeker aan. Veel mooier gebruik van coding en dat komt allemaal ten goede van jezelf en je misschien toekomstige koper.

Afgezien van deze tipjes mooie artikel smile Zeker voor de mensen die nog niet zo bekend zijn met het MVC principe.
0
Rogier

Lid · Topicstarter

Berichten
6.485
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
RoR is idd een framework, dat werkt met mvc, klein foutje zal het aanpassen. Voor de rest vind ik het een beetje onzin alle frameworks erbij te zetten. yummie
0
Berichten
1.544
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Snap ik ook wel, maar zijn de bekende. Als beginnend MVC verkenner moet je niet echt aan Zend beginnen. Later pas. Dan zijn CodeIgniter, Laravel en FuelPHP een goede optie. (Die kunnen nu al handig zijn voor mensen die baat hebben bij deze tut)
0
Rogier

Lid · Topicstarter

Berichten
6.485
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Ik moet eerlijk zeggen dat ik een beetje een fobie heb voor fuelPHP vind het verschrikkelijk werken.
0
Berichten
3.314
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Nuttige tut, heb er geen fouten in gezien.

Het valt me echt op hoeveel mensen de "dit werkt dus is het goed" mentaliteit hebben, ik bedoel, zelfs als jij de enige bent die aan je code werkt kan het nog zijn dat iemand anders eens een kijkje wil nemen/je project overnemen/je helpen etc.
0
Berichten
1.544
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Rogier schreef:
Ik moet eerlijk zeggen dat ik een beetje een fobie heb voor fuelPHP vind het verschrikkelijk werken.
Wat is het probleem ermee? Persoon ga ik ook liever voor Laravel, maar niks mis met FuelPHP toch?
0
Rogier

Lid · Topicstarter

Berichten
6.485
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Het is heel erg persoonlijk. Maar ik vind de docs van fuelPHP te weinig info bevatten. (naja ik heb Zend op mijn werk geleerd, dus dat is niet eerlijk wan tdan gebruik ik de docs niet).

Vind de manier van communicatie tussen MVC gewoon niet chill werken.
0
Berichten
308
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Zeer handige tut winkZal morgen meer zeggen want zit op smartphone.
0
Berichten
190
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Bedankt voor de goeie info!
0
Berichten
20.364
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Echt handig, want eerst snapte ik de nut van die 3 dingen niet. Voorheen gebruikte ik CakePHP, maar nu ga ik over naar CI. smile
0
Berichten
3.112
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Shahiem schreef:
Echt handig, want eerst snapte ik de nut van die 3 dingen niet. Voorheen gebruikte ik CakePHP, maar nu ga ik over naar CI. smile
CI werkt echt fijn als je het een beetje begrijpt.
0
Berichten
1.544
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Gamedealer schreef:
Eerdere citaten tonen
Shahiem schreef:
Echt handig, want eerst snapte ik de nut van die 3 dingen niet. Voorheen gebruikte ik CakePHP, maar nu ga ik over naar CI. smile
CI werkt echt fijn als je het een beetje begrijpt.
CI is al redelijk aan het verouderen. Ik zou naar de nieuwe generatie Frameworken kijken en ééntje die goed namespaces ondersteund.
0
Berichten
20.364
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Jenner schreef:
Eerdere citaten tonen
Gamedealer schreef:
Eerdere citaten tonen
Shahiem schreef:
Echt handig, want eerst snapte ik de nut van die 3 dingen niet. Voorheen gebruikte ik CakePHP, maar nu ga ik over naar CI. smile
CI werkt echt fijn als je het een beetje begrijpt.
CI is al redelijk aan het verouderen. Ik zou naar de nieuwe generatie Frameworken kijken en ééntje die goed namespaces ondersteund.
Welke? biggrin
0
Berichten
93.699
Reputatie
0
Punten
1,27
Lid sinds
Laatst gezien
Nice tut, leerzaam! wink
0

Jouw reactie

Deel je idee, stel een vraag of help een ander verder.

Editor laden…

Praat mee met de One2xs-community.

Inloggen om te reageren