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)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.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.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!
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]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 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>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!
Ruby on Rails is het framework en Ruby is de programmeer taal
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.
Zal morgen meer zeggen want zit op smartphone.