MVC structuur vraag
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
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
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
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)
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
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
}
};
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
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
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)
-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