In mijn ander topic heb ik het gehad over een registry, er werd mij verteld geen registry te gaan gebruiken.
Moet ik vanuit mijn Controllers elke keer alle object opnieuw maken? Er zijn bijvoorbeeld een aantal objecten die ik in alle controllers nodig heb, denk aan het Template object.
Verder kom ik er niet helemaal uit hoe ik dan de data naar de template stuur e.t.c.
Ik zie dat er een aantal mensen een array aanmaken, maar hoe gaat het dan met de objecten?
Een voorbeeld hoe ik het nu doe:
ArticleController
<?php
class ArticleController
{
private $_template;
function __construct()
{
$this->_template = new Template();
}
public function index()
{
$this->_template->setVars( 'test', 'DIT IS EEN TEST' );
$this->_template->setVars( 'tekst', 'Dit is tekst, leuk he!' );
$this->_template->show( 'article' );
}
}
?>
Template
<?php
class Template
{
private $_vars;
function __construct()
{
$this->_vars = array();
}
public function setVars( $name, $value )
{
$this->_vars[$name] = $value;
}
function show( $name )
{
$path = dirname(__FILE__) . '/../../../test.112pers.nl/public_html/view/' . $name . '.view.tpl';
if ( file_exists( $path ) == false )
{
throw new Exception( 'Template not found in '. $path );
return false;
}
// Load variables
if( $this->_vars )
{
foreach ( $this->_vars as $key => $value )
{
$$key = $value;
}
}
include ( $path );
}
}
?>
Ik zou minstens twee onderdelen toevoegen: een front controller of router die bepaalt wat er moet gebeuren (bijvoorbeeld een webpagina tonen) en een template engine die de complete webpagina opbouwt. Je hebt immers nog een view nodig waarin de header bovenaan en de footer onderaan komt, niet ergens anders.
Als je alle URL's herschrijft naar www·example·com/index.php, dan regelt dit PHP-bestand de routing. Dit wordt dan de dispatcher die bepaalt wat er bij een bepaalde URL moet worden gedaan door andere controllers.
<?
$frontController = new FrontController();
$frontController->execute( $request );
?>
De FrontController haalt vervolgens de Router op die geeft de juiste Route terug.
En vervolgens aan de hand van die Route de juiste Controller en Action.
Waar zou ik nu de afhandeling van de dispatcher moeten doen, en wat doet die dan precies?
De FrontController haalt vervolgens de Router op die geeft de juiste Route terug.
En vervolgens aan de hand van die Route de juiste Controller en Action.
Waar zou ik nu de afhandeling van de dispatcher moeten doen, en wat doet die dan precies?
De dispatch heb je dan al: aan de hand van de gevonden route de juiste controller een bepaalde actie laten uitvoeren.
Maar nu kom ik terug bij het voorbeeld dat je gaf.
"Bij HMVC bouw je een webpagina op met meerdere views/objecten. Je hebt nu een artikel in HTML, maar de webpagina bevat bijvoorbeeld ook nog reacties op dat artikel, een navigatiebalk, een zoekvak, een paar banners, een footer, enzovoort. Een deel daarvan heeft een eigen controller, vooral wanneer een object niet statisch maar dynamisch is, bijvoorbeeld het zoeksysteem en het bannermanagement."
Wat ik nu moet doen is dus in de juiste controller, in dit voorbeeld ArticleController de juiste models en views bij elkaar zoeken die ik nodig heb om de webpagina op de bouwen. (artikelen zelf, header, navigatie en footer)
Dat is prima, alleen heb je waarschijnlijk verschillende soorten pagina's. Je moet op dit punt dus beslissen wat de ArticleController eigenlijk doet: een artikel tonen of ruimer een webpagina?