MVC begin
Ik heb al vele tutorials bekeken, maar kom er niet helemaal uit hoe te beginnen.
Ik wil een nieuwssysteem maken.
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
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
<?php
// newsitem.controller.php
class NewsitemController
{
private $_model;
public function __construct($model)
{
$this->_model = $model;
}
public function create($id)
{
$this->_model->create($id);
}
public functin getAll()
{
$this->_model->getAll();
}
}
// newsitem.model.php
class NewsitemModel
{
private $_database;
public function __construct($database)
{
$this->_database = $database;
}
public function create($data)
{
}
public function getAll()
{
// hier komt de database actie..
}
}
// index.php
$model = new NewsitemModel($database);
$controller = new NewsitemController($model);
$controller->create($_GET["id"]);
?>
// newsitem.html
<h1><?php echo $title; ?></h1>
<p><?php echo $message; ?></p>
// newsitem.controller.php
class NewsitemController
{
private $_model;
public function __construct($model)
{
$this->_model = $model;
}
public function create($id)
{
$this->_model->create($id);
}
public functin getAll()
{
$this->_model->getAll();
}
}
// newsitem.model.php
class NewsitemModel
{
private $_database;
public function __construct($database)
{
$this->_database = $database;
}
public function create($data)
{
}
public function getAll()
{
// hier komt de database actie..
}
}
// index.php
$model = new NewsitemModel($database);
$controller = new NewsitemController($model);
$controller->create($_GET["id"]);
?>
// newsitem.html
<h1><?php echo $title; ?></h1>
<p><?php echo $message; ?></p>
Gewijzigd op 26/05/2014 16:27:33 door Roy B
Toevoeging op 26/05/2014 16:13:38:
Engels talig: http://code.tutsplus.com/tutorials/mvc-for-noobs--net-10488
En dat MVC for noobs bedoel ik niet beledigend, zo heet het artikel :P
Ik zou MVC niet als een kant en klaar pakket beschouwen, maar meer als een modelvorm om je applicatie in te programmeren.
Sorry Donny, maar misschien moet jezelf even dat artikel doorlezen. MVC is niet een kant en klaar pakket, waar slaat dat nu weer op? MVC staat voor Model-View-Controller wat een design pattern, of architectuur is voor een applicatie. Iedereen kan dat ontwikkelen, van een kleine applicatie tot een grote. Ja, veel frameworks gebruiken het, maar dat zegt nul komma niets over wat iemand anders ermee kan doen. Wat de TS wil kan dus prima in een MVC architectuur, als de TS dat wil.
@erwin: misschien verkeerd geformuleerd, maar ben me er goed van bewust wat een MVC is dus hoef em niet nog een keer door te lezen ;) 2x lezen is genoeg :)
Stel ik wil alle nieuwsitems ophalen, dan roep ik vanuit index.php mijn controller aan met de methode $controller->getAll(). Vervolgens vraagt de methode het model om deze gegevens op te halen uit de database. Stuur ik deze dan terug naar de controller en stuurt de controller deze naar de view?
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
// index.php
$model = new NewsitemModel($database);
$controller = new NewsitemController($model);
$controller->getAll();
?>
// index.php
$model = new NewsitemModel($database);
$controller = new NewsitemController($model);
$controller->getAll();
?>
Gewijzigd op 26/05/2014 16:29:31 door Roy B
Toevoeging op 26/05/2014 16:27:47:
Roy B op 26/05/2014 16:26:10:
De methode vraagt het model om deze gegevens op te halen uit de database. Stuur ik deze dan terug naar de controller en stuurt de controller deze naar de view?
Kort gezegd ja. In principe hebben model en view geen weet van elkaar en het model kan dus niet zelf data naar de view sturen.
Hoe ziet zo'n view er dan uit? En hoe stuurt de controller de data naar de view?
De view is de opmaak van de pagina die je opvraagt.
De controller vraagt de gegevens op van de model die het uit de database haalt en krijgt deze terug.
Dan kan de controller deze gegevens aan de view geven zodat de view deze informatie kan gebruiken.
( ps. ik ben geen pro en ik leg uit hoe ik het heb begrepen )
Donny Wie weet op 26/05/2014 16:12:10:
Een MVC is een kant en klaar pakket dat je kan gebruiken om websites overzichtelijker te maken.
Donny Wie weet op 26/05/2014 16:22:29:
@erwin: misschien verkeerd geformuleerd, maar ben me er goed van bewust wat een MVC is dus hoef em niet nog een keer door te lezen ;) 2x lezen is genoeg :)
Euh Donny... een MVC een kant-en-klaar pakket? Te gebruiken om websites overzichtelijker te maken? Euh... dat klopt niet helemaal zoals Erwin al aangaf.
Roy B op 26/05/2014 16:30:35:
Hoe ziet zo'n view er dan uit? En hoe stuurt de controller de data naar de view?
Een view kan in vele vormen komen, ook afhankelijk van hoe complex je site is. In veel gevallen kan je templates gebruiken, bijvoorbeeld smarty. Je kan ook een volkomen eigen view bouwen die helemaal vanaf scratch the html opbouwt (of wat voor output je ook moet genereren).
De controller heeft een referentie naar het object dat de view is en zal de data via een setter in de view plaatsen (of andere methode). Waar je in elk geval altijd voor moet zorgen is dat je een algemene structuur hebt voor de data. Ongeacht wat voor acties er moeten worden ondernomen, ongeacht wat voor output je moet genereren, je wilt altijd dezelfde datastructuur hebben voor de data die uit het model komt en naar de view gaat. Dat kan een array zijn, dat kan ook een container object zijn dat de data vast houdt. Als het maar altijd hetzelfde is. Het hele idee is namelijk dat view en model gescheiden zijn zodat je een ander model erin kan hangen zonder dat de view het merkt. Of, andersom, dat je een andere view erin hangt, die output verstuurt voor een ander device, zonder dat je het model hoeft aan te passen.
Roy B op 26/05/2014 16:30:35:
Hoe ziet zo'n view er dan uit? En hoe stuurt de controller de data naar de view?
controller - newsController.php
Code (php)
model - newsModel.php
Code (php)
view - latest_news.php
Code (php)
Gewijzigd op 26/05/2014 19:29:30 door Frank Nietbelangrijk
Deze laat de view en vult de variabele?
Gewijzigd op 26/05/2014 20:07:20 door Roy B
$data['title'] wordt dan $title. Hiervoor wordt de PHP functie extract() gebruikt:
http://nl1.php.net/extract
Ik maakte voorheen gebruik van DataMappers en haalde in mijn template de variable op met $newsitem->getTitle().
Dit is nu niet meer toepasselijk lijkt mij aangezien alle data nu direct wordt meegegeven aan de view?
@Frank Nietbelangrijk,
Kun je een voorbeeldje geven van hoe de methode load_view eruit ziet?
Waar wordt de locatie van de view meegegeven?
Gewijzigd op 27/05/2014 15:32:27 door Roy B
Roy B op 27/05/2014 15:29:34:
Ik maakte voorheen gebruik van DataMappers en haalde in mijn template de variable op met $newsitem->getTitle().
Dit is nu niet meer toepasselijk lijkt mij aangezien alle data nu direct wordt meegegeven aan de view?
Dit is nu niet meer toepasselijk lijkt mij aangezien alle data nu direct wordt meegegeven aan de view?
Jawel, je kunt nog steeds data mappers gebruiken, maar je koppelt dan de controller (C) aan de mapper, niet de view (V). Je mappers worden zo een deel van het model (M) en, beter nog, het enige deel van het model dat zichtbaar is voor controllers.
Ward van der Put op 27/05/2014 15:39:34:
Jawel, je kunt nog steeds data mappers gebruiken, maar je koppelt dan de controller (C) aan de mapper, niet de view (V). Je mappers worden zo een deel van het model (M) en, beter nog, het enige deel van het model dat zichtbaar is voor controllers.
Kun je hier een voorbeeldje van geven? Ik begrijp niet helemaal wat je bedoelt.
Gewijzigd op 27/05/2014 15:46:06 door Roy B
class User <-> class UserMapper <-> class DataAccessObject <-> Database
De DataMapper is dus een laag tussen de Controller en het Model?
Dan mijn volgende vraag:
Ik wil een database gaan koppelen, maar is dit een beetje de juiste manier?
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
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
<?php
// newsitem.model.php
class NewsitemModel
{
private $_database;
public function __construct($database)
{
$this->_database = $database;
}
}
// config.php
$host = "localhost";
$database = "";
$username = "";
$password = "";
$pdo = new PDO("mysql: host='.$localhost.'; dbname='.$database.'", "'.$username.'", "'.$password.'");
// news.php
include "config.php";
$model = new NewsitemModel($pdo);
$controller = new NewsitemController($model);
$controller->getAll();
?>
// newsitem.model.php
class NewsitemModel
{
private $_database;
public function __construct($database)
{
$this->_database = $database;
}
}
// config.php
$host = "localhost";
$database = "";
$username = "";
$password = "";
$pdo = new PDO("mysql: host='.$localhost.'; dbname='.$database.'", "'.$username.'", "'.$password.'");
// news.php
include "config.php";
$model = new NewsitemModel($pdo);
$controller = new NewsitemController($model);
$controller->getAll();
?>
Gewijzigd op 27/05/2014 16:26:17 door Roy B
Nee, de DataMapper is een invulling van de Model laag.
Haha, blijft lastig hoewel het toch al wat duidelijker wordt.
Als ik het dus goed begrijp, kun je in plaats van:
Code (php)
1
2
3
4
2
3
4
<?php
$user_mapper = new UserMapper();
$user = $user_mapper->load(12); // 12 is het ID van de User
?>
$user_mapper = new UserMapper();
$user = $user_mapper->load(12); // 12 is het ID van de User
?>
Ook dit doen:
Zelfde principe alleen een ander naampje?
Toevoeging op 27/05/2014 17:12:31:
Offtopic:
Is een mapper of model een class die je statisch zou kunnen maken?
Gewijzigd op 27/05/2014 17:09:04 door Ozzie PHP