MVC

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Steen

steen

02/01/2010 23:58:00
Quote Anchor link
Beste PHP'ers,

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?
 
PHP hulp

PHP hulp

07/12/2021 21:30:55
 
Steen

steen

04/01/2010 14:43:00
Quote Anchor link
bump
 
Bas IJzelendoorn

Bas IJzelendoorn

04/01/2010 15:00:00
Quote Anchor link
Vind je vraag onduidelijk. en betreft

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.
Gewijzigd op 01/01/1970 01:00:00 door Bas IJzelendoorn
 
Jelmer -

Jelmer -

04/01/2010 15:20:00
Quote Anchor link
Je model is meer een naam om een deel van je code aan te geven. Alle code die je gebruikt om in essentie te doen wat je wilt doen is je model. Alle code die daaromheen nodig is, zoals het afhandelen van forms, het genereren van queries, het omzetten van forumposts in HTML, is dat niet. Je model is je business logic, en eigenlijk dat wat je hele applicatie zou zijn als je direct PHP code zou kunnen lezen en uitvoeren en geen website eromheen nodig zou hebben.

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?
 
Steen

steen

04/01/2010 15:22:00
Quote Anchor link
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.
 
Henk PHP

Henk PHP

04/01/2010 17:21:00
Quote Anchor link
@Jelmer, in die classes Bericht en Berichten_Store kunnen wel queries zitten toch? ookal zijn ze het model?
 
Mr D

Mr D

04/01/2010 17:28:00
Quote Anchor link
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
Gewijzigd op 01/01/1970 01:00:00 door Mr D
 
Henk PHP

Henk PHP

04/01/2010 18:07:00
Quote Anchor link
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?
 
Jelmer -

Jelmer -

04/01/2010 20:41:00
Quote Anchor link
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.
 
Steen

steen

04/01/2010 21:08:00
Quote Anchor link
Hoe zou ik dat script verder moeten gebruiken wanneer ik bijvoorbeeld, het simpelste voorbeeld dat er zo'n beetje bestaat, een nieuwssysteem wil maken?
 
Jelmer -

Jelmer -

04/01/2010 21:15:00
Quote Anchor link
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.
 
Steen

steen

04/01/2010 21:21:00
Quote Anchor link
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.
 
Jelmer -

Jelmer -

04/01/2010 22:26:00
Quote Anchor link
Je kan heel simpel beginnen. Je maakt in je database een tabel met nieuwsberichten aan en zet er vast wat nieuwsberichten in.

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
class News_Item
{
    public $id;
    
    public $title;
    
    public $content;
    
    public $pubDate;
}

?>

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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();
    }
}

?>

Nu kan je je controller vullen. Bijvoorbeeld
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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');
    }
}

?>


Snapie?
 
Mr D

Mr D

05/01/2010 12:47:00
Quote Anchor link
@Jelmer mooi voorbeeldje. Maar om het even wat moeilijker te maken ;). Wat als je ook de mogelijkheid hebt om ook bij elk nieuwsbericht reacties te plaatsen. En je wilt bijvoorbeeld bij elk nieuwsbericht alleen de laatste 5 reacties tonen.

In je template wil je dan waarschijnlijk zo iets doen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<? foreach ($news_item->getLatestComments(5) as $comment): ?>

hier wat html
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<? endforeach ?>


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? :)
 
Jelmer -

Jelmer -

05/01/2010 23:47:00
Quote Anchor link
Lijkt mij een prima manier :)

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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.