MVC structuur vraag

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Tim Kusters

Tim Kusters

03/06/2013 17:36:59
Quote Anchor link
Beste gebruikers,

Ik ben al een aantal dagen bezig een poging te doen een goed werkend MVC framework te maken.
Maar daarbij loop ik tegen een aantal problemen aan.

Eerste even een korte uitleg hoe het nu bij mij werkt.

URL >
Router class >
Controller class
Fetch data from model & passed to register class
View class
Fecth data from register
> Show Template (template class)


Dit is even kort de route die er doorlopen wordt.
(Eventuele opmerkingen hoor ik graag!).

Nu loop ik er tegen aan dat er vaak functies zijn die dubbel worden uitgevoerd, en ophalen van metadata voor de website bijvoorbeeld. Moet ik nu in elke base controller deze serie calls naar models oproepen? Of mag ik een subcontroller maken die dat doet?

Graag jullie reactie.

Groeten, Tim
Gewijzigd op 03/06/2013 21:28:54 door Tim Kusters
 
PHP hulp

PHP hulp

23/12/2024 05:30:47
 
Jasper DS

Jasper DS

03/06/2013 19:21:30
Quote Anchor link
Hoi,

dus als ik je woorden even herschrijf volgen we deze route bij een request:

request >> router class (kijkt of de url overeenkomt met een route) >> front-controller (spreekt de juiste controller aan die bij de route hoort die men terug kreeg van de router class) >> controller >> models & views >> display

je "fetch-data" wordt slechts één keer in je controller uitgevoerd en per request is er slechts één controller?

Ik denk dat er daar iets fout loopt, hoe ziet je controller-werking er juist uit?

Jasper
 
Tim Kusters

Tim Kusters

03/06/2013 19:37:50
Quote Anchor link
Hey Jasper,

Klopt, de fecth data wordt maar 1x uitgevoerd, namelijk in de functie van de controller. Bijvoobeeld index of view. En per request is er dan maar 1 controller? (nu is dat inderdaad zo).

Maar dat betekend dat de lijnen code voor bijvoorbeeld het ophalen van de navigatie in elke controller zouden moeten worden herhaald, en dat lijkt me weer onlogisch?

Gr Tim
 
Frank Nietbelangrijk

Frank Nietbelangrijk

03/06/2013 22:43:50
Quote Anchor link
Tim Kusters op 03/06/2013 19:37:50:
Maar dat betekend dat de lijnen code voor bijvoorbeeld het ophalen van de navigatie in elke controller zouden moeten worden herhaald, en dat lijkt me weer onlogisch?


Nee dat is niet onlogisch. Want wat als je nu een pagina wilt genereren zonder navigatie? of wat als je nu een pagina wil genereren die een PDF uitspuugt of een JSON?

Bovendien je kunt toch een base-controller maken en dan een custom-controller die direct een menu aanmaakt en daaroverheen weer een eind-controller die voor iedere pagina weer anders is.
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
<?php
class Controller {
    function
__construct() {
        // stuff here
    }
    
};


class PublicPageController extends Controller {
    function
__construct() {
        parent::__construct();
        $this->BuildMenu();
    }


    protected function BuildMenu() {
        // genereer menu en sla op voor de view
    }
};


class HomepageController extends PublicPageController {
    function
__construct() {
        parent::__construct();
    }


    public function Index() {
        // genereer index pagina
    }
};
Gewijzigd op 03/06/2013 23:33:07 door Frank Nietbelangrijk
 
Tim Kusters

Tim Kusters

03/06/2013 22:59:25
Quote Anchor link
Hey Frank,

Bedankt voor je reactie. Ik vindt het ook niet logisch vandaar mijn vraag.

Maar welke controller roept de router nu op in jouw voorbeeld?

En stel, we hebben niet alleen de navigatie, maar ook wat metadata, footer-data, header data etc, waar pas ik die dan in?

Groeten,
Tim
 
Wouter J

Wouter J

03/06/2013 23:17:12
Quote Anchor link
Ai frank, die code kan totaal niet. HomepageController kan nooit een IS EEN relatie hebben met MenuController.

Tim, wat je dan hebt is dat je meerdere controllers per request op moet roepen. De url wordt gekoppeld aan een controller, bijv. HomepageController. Vervolgens wordt er in de template van de homepage controller de menu controller aan geroepen, om jet menu te genereren.

Dit zou ik overigens niet voor menu's doen, daar vind ik controller heel vreemd klinken. Gebruik gewoon een klasse die een menu maakt en weergeeft, bijv. MenuBuilder. (kijk ook eens naar KnpMenu)
 
Frank Nietbelangrijk

Frank Nietbelangrijk

03/06/2013 23:28:58
Quote Anchor link
Tim stel je wilt een website maken met vier pagina's:
-home (of index)
-about
-contact
-stats

de eerste drie zijn gewone publieke pagina's waar je altijd dezelfde menu zult zien en dezelfde footer
stats wordt een pagina die alleen bedoeld is voor de webmaster en die laat wat statistieken zien. er komt geen menu en een totaal ander footer.

de bovenste class is de basis. elke controller wordt hier verplicht van afgeleid. stats maakt direct gebruik van deze controller.
voor de overige drie pagina's zou je hetzelfde kunnen doen. maar dat betekend drie keer een menu maken en drie keer een footer maken die drie keer exact gelijk zijn. Wil je later iets wijzigen dan moet je dat drie keer gaan doen. Dat wil je dus niet. Dus maak je eerst een class die alles doet dat voor die drie pagina's gelijk is. hij maakt een menu, een footer en al wat je maar wilt. dat is de PublicPageController.
dan komen we bij de uiteindelijke pagina home. die moet natuurlijk een andere tekst krijgen dan de about of de contact pagina. dus dat wordt de HomepageController. zoals je ziet aan het woord extends erft HomepageController alles van PublicPageController en heeft die dus direct alles aan boord om een standaard gebruikers pagina te maken.

Overigens de Routing zorgt er enkel voor dat je bij de juiste controller komt.
De controller zorgt er voor dat het juiste Model/Modellen geladen worden en dat de juiste View geladen wordt.
Het Model haalt data op en geeft die terug aan de controller.
De controller geeft de data door aan de view.

Toevoeging op 03/06/2013 23:31:58:

ja MenuController is geen goede naam.. misleidend inderdaad.. hoe noemen we dat dan:

Controller
PublicPageController
HomepageController

is dat beter? Ik heb het aangepast
Gewijzigd op 03/06/2013 23:34:46 door Frank Nietbelangrijk
 
Ward van der Put
Moderator

Ward van der Put

04/06/2013 08:14:36
Quote Anchor link
Ik zou niet alles een "controller" noemen. Als je MVC implementeert, zou ik bovendien vooral een "view" nooit een "controller" noemen.

Afbeelding
 



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.