Hallo iedereen,

Ik vroeg met af of je in een HMVC omgeving een standaart hebt hoe je controllers aanroept.
Normaal gezien laadt je maar 1 controller alleen in hmvc kun je meerdere controllers laden, Maar wordt deze in de (bijvoorbeeld ) index controller geladen of in de view of model ?

Kwam er zelf niet helemaal uit zelfs met zoeken want daar lees ik meer over modules. ( dus bijv, twitter module, facebook, blog, rss ect. )
Gr wouter.
De eerste controller wordt door de router aangeroepen. De overige via de view.

Bijv. je geeft een route op voor index.php/contact (of index.php?page=contact):

main_contact:
    pattern:  /contact
    defaults: { _controller: MainBundle:Contact:index }


De controller:
<?php

class ContactController extends BaseController
{
public function indexAction()
{
$data = array(
'somedata' => 'somedata'
);
);

return $this->render('MainBundle:Contact:index.html.twig', $data);
}
?>

De View:

<!doctype html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Contact</title>
	</head>
    
	<body>
		<h1>Contact</h1>
		
		<!-- CONTACT INFO HERE -->

		<div class="sidebar-frame">
			{{ render(controller('MainBundle:Sidebar:index')) }}
		</div>
	</body>
</html>


Zoals je in de view hierboven kunt lezen wordt er weer een nieuwe controller aangeroepen om de sidebar weer te geven.

Voorbeeldje komt van Symfony maar dat is geen HMVC framework. Het principe is echter gelijk, het enigste verschil is dat Symfony geen Models kent. In plaats van een Model aan te roepen vanuit de controller wordt de data gewoon in de controller zelf verzameld. De exacte notatie van bijvoorbeeld de routes zijn per framework wel verschillend.
Hallo Frank,

Bedankt voor je antwoord.
In jouw voorbeeld gebruik je symfony en die gebruikt weer twig.
Nu gebruik ik alleen twig en heb ik geen toegang tot de render functie die symfony wel heeft.

Dit zou dus betekenen dat ik een twig extension moeten maken die de render functie nabootst.
Of in ieder geval een extension maken die een "controller/module" kan aanroepen en gebruik kan maken van alle functies die beschikbaar zijn.

Heb jij misschien een idee hoe ik dit het beste kan doen.
Met betrekking tot het aanroepen van de functie in van de "controller/module" ?
Klopt frank,
Had dat topic al doorgelezen en heb al wel een idee hoe ik het wil implementeren.
Zal denk ik nog wel problemen tegen komen maar ik zal er eens een begin aan maken morgen.
Bedankt wouter!
Had al gekeken hoe symfony dat deed maar keek op de verkeerde plek.
Zal hier morgen/vanmiddag na kijken.
Heb nu nachtdienst dus kan niet veel doen jammer genoeg
@Frank:

Als je die extra controllers in een view onderbrengt die bij de contactpagina hoort, dan krijg je dus telkens dezelfde pagina als je de contactpagina aanroept. Ik dacht eigenlijk dat het idee was dat zo'n pagina dynamisch (aan de hand van configuratie) wordt opgebouwd. Bijv. website A en B hebben allebei een contactpagina, maar op website B wordt een routebeschrijving getoond en op website A niet. Als je het in de view implementeert staat alles vast lijkt mij.
@ozzie, je gebruikt geen hele contact pagina als module. (als het goed Is)
Het zijn voornamelijk kleine elementen die je opnieuw kunt gebruiken op meerdere pagina's als dit nodig is.
Denk hier bijvoorbeeld aan een navigatie module die je in een master layout zet.
Of een fb like module die je in een pagina of blog view verwerkt.

Dit zijn maar voorbeelden natuurlijk.
En wat mij ook een voordeel lijkt is dat je een default style zou kunnen toepassen op de modules en eventueel kunt aanpassen.
Ozzie PHP op 03/10/2014 01:10:32

@Frank:

Als je die extra controllers in een view onderbrengt die bij de contactpagina hoort, dan krijg je dus telkens dezelfde pagina als je de contactpagina aanroept. Ik dacht eigenlijk dat het idee was dat zo'n pagina dynamisch (aan de hand van configuratie) wordt opgebouwd. Bijv. website A en B hebben allebei een contactpagina, maar op website B wordt een routebeschrijving getoond en op website A niet. Als je het in de view implementeert staat alles vast lijkt mij.


Volgens mij is het idee om dubbele code te voorkomen.
Als we op alle pagina's dezelfde sidebar willen zien en we hebben vijf verschillende pagina's dan gaan we natuurlijk niet vijf keer dezelfde code herhalen. (logisch toch) Dat is naar mijn idee dé reden. Verder kan het juist zeer zeker wél dynamisch:

1. je hebt alle vrijheid in je controller(s).
2. in twig kun je heel simpel een if() - else() - endif gebruiken.
3. je kunt een foreach() e.d? in twig gebruiken
4. je zou zelfs nog een array met config waardes kunnen meegeven. (not done)


Dus ook het aanroepen van die controller kan in een if()
Correct: Don't repeat yourself zou Artikel 1 in de Grondwet van OOP-land kunnen zijn.

Zodra je op het punt staat twee keer hetzelfde te gaan doen, moet je gaan refactoren. Bijvoorbeeld naar een service.

In dat opzicht is de naam HMVC misleidend, want het is geen MVC. Refactoren betekent namelijk niet automatisch dat je die dubbelingen in code dan in twee controllers gaat uitsplitsen.

De hiërarchie bij HMVC ontstaat niet doordat je MVC-modules binnen MVC-modules gebruikt, zoals een social media buttons-module binnen een footer-module binnen een webpagina-module. Dán krijg je inderdaad iets dat je niet wilt: een controller die vanuit een bovenliggende view in de hiërarchie wordt aangesproken. Je regelt dat op een hoger niveau, in de configuratie en in services van een kernel.

Reageren