Beginnen met MVC
Ik heb nu de basis van PHP wel gezien, en wil nu graag beginnen met het scripten in een MVC-pattern. Na de nodigde informatie verzameld te hebben, ben ik vandaag begonnen met het schetsen van de pattern. Ik wil graag voordat ik ga beginnen om het toe te passen graag weten of deze schets wel klopt, en dat ik het hele gebeuren wel begrepen heb. Daarom wil ik graag op/aanmerkingen over de onderstaande schets horen.
Tom
Je wilt graag de view scheiden van de model en je hebt dan een controller die de acties tussen model en view regelt. Eigenlijk super logisch, dus ja je opbouw klopt wat mij betreft wel. Alleen naar mijn idee moet je het je eigen maken, dus precies en exact mvc toepassen lijkt me dan ook niet nodig. Het is meer een logische stap naar verbetering. Je scheidt gewoon allerlei dingen.
Correct me if i'm wrong.
Een View kan ook direct informatie uit de Model halen, maar dit mag alleen als het presentatie is van de data, dus geen bewerkingen daarop uitvoeren.
Een mooi voorbeeld is een paarden race wedstrijd.
Vooral waar dan op gegokt word.
- Aan het eind van de race heeft ieder paard een tijd gereden.
- De Controller krijgt deze gegevens binnen en verwerkt ze naar het model.
- De Controller vraagt deze gegevens weer op en verwerkt ze naar een presentabele manier.
- De ene view geeft alle tijden op een groot beeldscherm wat in de stadions hangt.
- Een andere View stuurt smsjes met alle tijden daarin.
- Nog een andere View geeft alles weer op een website
Zo krijg je dus dat je slechts 1 Model en 1 Controller nodig hebt, om een heel scala aan Views te creëren.
Dat is dus juist het groote voordeel aan MVC ten opzichte van de normale programmeer manier.
nico schreef op 25.02.2009 18:48:
Het hele principe van MVC is eigenlijk dat het mogelijk word om met één Controller meerdere Views kan creëren en eventueel ook verschillende Models kan afhandelen.
Een View kan ook direct informatie uit de Model halen, maar dit mag alleen als het presentatie is van de data, dus geen bewerkingen daarop uitvoeren.
Een mooi voorbeeld is een paarden race wedstrijd.
Vooral waar dan op gegokt word.
- Aan het eind van de race heeft ieder paard een tijd gereden.
- De Controller krijgt deze gegevens binnen en verwerkt ze naar het model.
- De Controller vraagt deze gegevens weer op en verwerkt ze naar een presentabele manier.
- De ene view geeft alle tijden op een groot beeldscherm wat in de stadions hangt.
- Een andere View stuurt smsjes met alle tijden daarin.
- Nog een andere View geeft alles weer op een website
Zo krijg je dus dat je slechts 1 Model en 1 Controller nodig hebt, om een heel scala aan Views te creëren.
Dat is dus juist het groote voordeel aan MVC ten opzichte van de normale programmeer manier.
Een View kan ook direct informatie uit de Model halen, maar dit mag alleen als het presentatie is van de data, dus geen bewerkingen daarop uitvoeren.
Een mooi voorbeeld is een paarden race wedstrijd.
Vooral waar dan op gegokt word.
- Aan het eind van de race heeft ieder paard een tijd gereden.
- De Controller krijgt deze gegevens binnen en verwerkt ze naar het model.
- De Controller vraagt deze gegevens weer op en verwerkt ze naar een presentabele manier.
- De ene view geeft alle tijden op een groot beeldscherm wat in de stadions hangt.
- Een andere View stuurt smsjes met alle tijden daarin.
- Nog een andere View geeft alles weer op een website
Zo krijg je dus dat je slechts 1 Model en 1 Controller nodig hebt, om een heel scala aan Views te creëren.
Dat is dus juist het groote voordeel aan MVC ten opzichte van de normale programmeer manier.
hier ben ik het helemaal mee eens.
als ik jouw verhaal zo lees, zie ik dat het dus waarschijnlijk ook handig is om een connectie tussen het model & de view te maken??
Als je geen enkele vorm van wijzigen uitvoert op de opgehaalde gegevens, (tenzij in de sql zelf) dan is het toegestaan om direct in de view de gegevens op te halen.
Dus bijvoorbeeld het weergeven van een profiel, dan zou dit kunnen.
Maar al het reken en wijzig werk laat je over aan je controller.
MAAR, als diezelfde output in iedere view hetzelfde is, dan doe je het weer wel in de controller, omdat het toch niet veranderd.
nico schreef op 25.02.2009 18:55:
Zo af en toe kan dat handig zijn.
Als je geen enkele vorm van wijzigen uitvoert op de opgehaalde gegevens, (tenzij in de sql zelf) dan is het toegestaan om direct in de view de gegevens op te halen.
Dus bijvoorbeeld het weergeven van een profiel, dan zou dit kunnen.
Maar al het reken en wijzig werk laat je over aan je controller.
MAAR, als diezelfde output in iedere view hetzelfde is, dan doe je het weer wel in de controller, omdat het toch niet veranderd.
Als je geen enkele vorm van wijzigen uitvoert op de opgehaalde gegevens, (tenzij in de sql zelf) dan is het toegestaan om direct in de view de gegevens op te halen.
Dus bijvoorbeeld het weergeven van een profiel, dan zou dit kunnen.
Maar al het reken en wijzig werk laat je over aan je controller.
MAAR, als diezelfde output in iedere view hetzelfde is, dan doe je het weer wel in de controller, omdat het toch niet veranderd.
ok, dan zet ik er een pijltje bij
Gewijzigd op 01/01/1970 01:00:00 door Tom K
Ik zou het woordje "Browser" veranderen in "Request", het 'entry-point' van je applicatie is namelijk niet per definitie een browser, maar start wel altijd via een Request.
FrontController of Router (Router wordt toch wel vaker gebruikt eigenlijk).
Browser -> FrontController -> Router -> Dispatcher -> Controller
Controller -> Model
Controller -> View
View -> Model
Model -> Database
Model -> Andere storages (XML, Webservice, etc)
Edit: reactie op Gamer: een Router en FrontController zijn twee totaal verschillende dingen. De FrontController gebruikt een router om je request om te zetten in een route, die vervolgens aan de Dispatcher wordt gegeven om naar de Controller te gaan.
Gewijzigd op 01/01/1970 01:00:00 door PHP erik
Hmm, zover ik weet is er tussen Controller en Request een Router gereserveerd...
Verder nog ter aanvulling op de afbeelding; de Model is niet je datamodel, het is je complete business logica (ook wel domain logic genoemd). Je Model is veruit je belangrijkste laag in de applicatie. Een Controller bevat inderdaad enkel applicatie logica.
Code (php)
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
/********************************************************
* _____ _ _ *
* | __ \ | | | | Version 1 Beta *
* | | | | _____ _| |__| | ___ _ _ ___ ___ *
* | | | |/ _ \ \ / / __ |/ _ \| | | / __|/ _ \ *
* | |__| | __/\ V /| | | | (_) | |_| \__ \ __/ *
* |_____/ \___| \_/ |_| |_|\___/ \__,_|___/\___| *
* *
* @version: 1 *
* @author: Tom Keim *
* @copyright: (c) DevHouse *
*********************************************************
*********************************************************
* @file: FrontController.php *
* @description: The file with the FrontController *
*********************************************************/
class FrontController
{
public function __construct()
{
if(isset($_SERVER['PATH_INFO']))
{
/* PATH_INFO exists */
$parts = explode('/', strtolower(trim($_SERVER['PATH_INFO'], '/'))); //Set PATH_INFO to array
$controller = ( current ( $parts ) ) ? array_shift ( $parts ) : 'default'; //Set controller to controller name or default
$action = (current ( $parts ) ) ? array_shift ( $parts ) : 'index'; //Set action to action name or index
}
else
{
/* PATH_INFO don't exists */
$controller = 'default'; //Set $controller to default
$action = 'index'; //Set action to index
}
$this->dispatch($controller, $action); //Dispatch
}
public function dispatch($controller, $action)
{
$controllerName = ucfirst($controller).'Controller'; //Set controllerName to the controller name.
$actionName = ucfirst($action).'Action'; //Set Action name to the action name
if(file_exists(Routes::controllers.$controllerName.'.php'))
{
/* The controller file exists */
require_once(Routes::controllers.$controllerName.'.php'); //Require the Controller File
if(class_exists($controllerName))
{
/* The controller class exists */
if(in_array($actionName , get_class_methods($controllerName)))
{
/* The Controller Action exists */
$controllerObject = new $controllerName(); //Start controller object
$controllerObject->$actionName(); //Start controller action
}
else
{
/* The Controller Action don't exists(404) */
throw new Exception('(CONTROLLERACTION):('.$controllerName.'):('.$actionName.')', 404); //Set error
}
}
else
{
/* The controller class don't exists(404) */
throw new Exception('(CONTROLLERCLASS):('.$controllerName.')', 404); //Set error
}
}
else
{
/* The controller file don't exists(404) */
throw new Exception('(CONTROLLERFILE):('.$controllerName.'):('.Routes::controllers.$controllerName.'.php)', 404); //Set error
}
}
}
[/code]
/********************************************************
* _____ _ _ *
* | __ \ | | | | Version 1 Beta *
* | | | | _____ _| |__| | ___ _ _ ___ ___ *
* | | | |/ _ \ \ / / __ |/ _ \| | | / __|/ _ \ *
* | |__| | __/\ V /| | | | (_) | |_| \__ \ __/ *
* |_____/ \___| \_/ |_| |_|\___/ \__,_|___/\___| *
* *
* @version: 1 *
* @author: Tom Keim *
* @copyright: (c) DevHouse *
*********************************************************
*********************************************************
* @file: FrontController.php *
* @description: The file with the FrontController *
*********************************************************/
class FrontController
{
public function __construct()
{
if(isset($_SERVER['PATH_INFO']))
{
/* PATH_INFO exists */
$parts = explode('/', strtolower(trim($_SERVER['PATH_INFO'], '/'))); //Set PATH_INFO to array
$controller = ( current ( $parts ) ) ? array_shift ( $parts ) : 'default'; //Set controller to controller name or default
$action = (current ( $parts ) ) ? array_shift ( $parts ) : 'index'; //Set action to action name or index
}
else
{
/* PATH_INFO don't exists */
$controller = 'default'; //Set $controller to default
$action = 'index'; //Set action to index
}
$this->dispatch($controller, $action); //Dispatch
}
public function dispatch($controller, $action)
{
$controllerName = ucfirst($controller).'Controller'; //Set controllerName to the controller name.
$actionName = ucfirst($action).'Action'; //Set Action name to the action name
if(file_exists(Routes::controllers.$controllerName.'.php'))
{
/* The controller file exists */
require_once(Routes::controllers.$controllerName.'.php'); //Require the Controller File
if(class_exists($controllerName))
{
/* The controller class exists */
if(in_array($actionName , get_class_methods($controllerName)))
{
/* The Controller Action exists */
$controllerObject = new $controllerName(); //Start controller object
$controllerObject->$actionName(); //Start controller action
}
else
{
/* The Controller Action don't exists(404) */
throw new Exception('(CONTROLLERACTION):('.$controllerName.'):('.$actionName.')', 404); //Set error
}
}
else
{
/* The controller class don't exists(404) */
throw new Exception('(CONTROLLERCLASS):('.$controllerName.')', 404); //Set error
}
}
else
{
/* The controller file don't exists(404) */
throw new Exception('(CONTROLLERFILE):('.$controllerName.'):('.Routes::controllers.$controllerName.'.php)', 404); //Set error
}
}
}
[/code]