MVC
Ik heb van de volgende site een MVC-pattern (of wat het ook precies moet voorstellen gedownload):
http://www.phpro.org/tutorials/Model-View-Controller-MVC.html
(het .tar.gz bestand bevat alleen geen .htaccess, de code staat op de site)
Nu wil ik dit uitbreiden met een database, maar wil ik de sql scheiden uit de controller (model). Hoe moet nu bijvoorbeeld een indexModel.class.php er uit zien?
bump
Quote:
Hoe moet nu bijvoorbeeld een indexModel.class.php er uit zien?
[/qoute]
hoort dit niet onder aanvragen of vacatures. Je moet zelf wel met een opzetje anders komen.
[/qoute]
hoort dit niet onder aanvragen of vacatures. Je moet zelf wel met een opzetje anders komen.
Gewijzigd op 01/01/1970 01:00:00 door Bas IJzelendoorn
Dus je hebt geen indexModel, omdat index een onderdeel is van het weergeven, en niet van dat wat je wilt weergeven.
Bij een gastenboek bestaat je model bijvoorbeeld uit een class Bericht, en een class Berichten_Store. Dit zijn de enige twee classes die beschrijven hoe daadwerkelijk berichten in het gastenboek komen, en hoe die berichten eruit zien.
Dus de hamvraag is meer: Wat wil je maken?
Nee dit is écht geen vacature =). Ik zou graag willen weten hoe ik zo'n pattern uit zou moeten breiden. Er is alleen een database class gegeven, maar niet het gebruik daarvan. Nu zou ik de sql-code gescheiden willen hebben (een Model), maar ik weet niet precies hoe ik dit aan zou moeten pakken.
@Jelmer, in die classes Bericht en Berichten_Store kunnen wel queries zitten toch? ookal zijn ze het model?
Gewijzigd op 01/01/1970 01:00:00 door Mr D
Mr D schreef op 04.01.2010 17:28:
De queries naar je database voer je op een plek uit, de queries voor het opslaan en ophalen van berichten voer je allemaal uit in je Berichten_Store. Als je Berichten_Store bijvoorbeeld een method getAll() heeft voert deze method de query uit en returnt vervolgens en ArrayObject of een gewone array van Bericht objecten
Maar de Berichten_Store kan dus wel een query (naar de database) uitvoeren?
Ja. Bericht kan niet een query uitvoeren, want dat is voor bericht niet een verantwoordelijkheid. Berichten_Store heeft een database-verbinding nodig om te kunnen werken, want berichten opslaan en ophalen is wel zijn verantwoordelijkheid.
Hoe zou ik dat script verder moeten gebruiken wanneer ik bijvoorbeeld, het simpelste voorbeeld dat er zo'n beetje bestaat, een nieuwssysteem wil maken?
Kijk even in de OOP categorie van dit forum (zolang die nog bestaat) want daar staan tal van topics in waarin in en anderen uitgebreid voorbeelden geven. Zeker van de afgelopen twee weken.
Dat is voor mij een beetje het probleem, als er zoals die link bovenaan een duidelijke basis (met een voorbeeldje voor een nieuwssysteempje of mini-blog ofzo) zou zijn zou ik dit verder kunnen uitwerken voor grotere systemen. Alleen nu heb ik die link, alleen is het model niet compleet. Zou iemand misschien de moeite kunnen/willen nemen om dat script verder te verwerken (niet compleet, maar één of twee functies ofzo) zodat het mij duidelijk wordt. Dan zal ik het complete systeem aan de libary toevoegen als het klaar is.
Vervolgens maak je de class die een nieuwsbericht representeert. Eigenlijk is dit niet veel meer dan een veredelde array waarvan alle keys alvast bekend zijn :) Maar dit is programmeren in objecten, en arrays gebruik je dan alleen nog om lijsten mee te schrijven ;)
Code (php)
De properties komen eigenlijk direct overeen met de kolommen van je database-tabel.
Mooi, nu heb je de records in de database, en het vormpje waarin die records gegoten moeten worden. Daarvoor de News_Store:
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
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
<?php
class News_Store
{
protected $pdo;
public function __construct(PDO $pdo)
{
$this->pdo = $pdo;
}
public function findAll()
{
$stmt = $this->pdo->query('SELECT id, title, content, pubDate FROM news_items');
// dit zorgt ervoor dat je News_Item objecten terugkrijgt
// van PDO, compleet ingevuld en wel. Later zal dit wss
// niet meer kunnen omdat je News_Item class ingewikkelder
// wordt, maar voor nu is het heerlijk kort :)
$stmt->setFetchMode(PDO::FETCH_CLASS, 'News_Item');
return $stmt->fetchAll();
}
public function findById($id)
{
$stmt = $this->pdo->prepare('SELECT id, title, content, pubDate FROM news_items WHERE id = :id');
$stmt->bindParam(':id', $id);
$stmt->setFetchMode(PDO::FETCH_CLASS, 'News_Item');
return $stmt->fetch();
}
}
?>
class News_Store
{
protected $pdo;
public function __construct(PDO $pdo)
{
$this->pdo = $pdo;
}
public function findAll()
{
$stmt = $this->pdo->query('SELECT id, title, content, pubDate FROM news_items');
// dit zorgt ervoor dat je News_Item objecten terugkrijgt
// van PDO, compleet ingevuld en wel. Later zal dit wss
// niet meer kunnen omdat je News_Item class ingewikkelder
// wordt, maar voor nu is het heerlijk kort :)
$stmt->setFetchMode(PDO::FETCH_CLASS, 'News_Item');
return $stmt->fetchAll();
}
public function findById($id)
{
$stmt = $this->pdo->prepare('SELECT id, title, content, pubDate FROM news_items WHERE id = :id');
$stmt->bindParam(':id', $id);
$stmt->setFetchMode(PDO::FETCH_CLASS, 'News_Item');
return $stmt->fetch();
}
}
?>
Nu kan je je controller vullen. Bijvoorbeeld
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
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
<?php
// (wat een stomme naamgeving, classes met een kleine letter
// beginnen? Dat is zooo not done!)
class NewsController extends baseController
{
public function __construct($register)
{
parent::__construct($register);
$this->news_store = new News_Store($this->register->db);
}
public function index()
{
$news_items = $this->news_store->findAll();
$this->register->template->news_items = $news_items;
$this->register->template->show('news_index');
}
public function item()
{
$news_item = $this->news_store->findById($_GET['id']);
$this->register->template->news_item = $news_item;
$this->register->template->show('news_item');
}
}
?>
// (wat een stomme naamgeving, classes met een kleine letter
// beginnen? Dat is zooo not done!)
class NewsController extends baseController
{
public function __construct($register)
{
parent::__construct($register);
$this->news_store = new News_Store($this->register->db);
}
public function index()
{
$news_items = $this->news_store->findAll();
$this->register->template->news_items = $news_items;
$this->register->template->show('news_index');
}
public function item()
{
$news_item = $this->news_store->findById($_GET['id']);
$this->register->template->news_item = $news_item;
$this->register->template->show('news_item');
}
}
?>
Snapie?
In je template wil je dan waarschijnlijk zo iets doen
hier wat html
En dan voor je News_Item een method setCommentStore(Comment_Store $store) zodat elk nieuwsbericht zelf zijn laatste reacties kan ophalen via de Comment_Store. Dit is zo ongeveer de manier waarop ik dit zou doen. Maar ik ben benieuwd of er betere manieren zijn en hoe jij dit oplost? :)
Ik denk dat je inderdaad de News_Item wel kan koppelen aan de comments. Mocht je dat niet willen, dan kan je altijd nog iets doen a la $comment_store->getLatestForNewsItem($news_item, 5). Want comments zijn wel afhankelijk van nieuws, maar andersom niet.