Beste Programmeurs,

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 );
    }
}
?>
@Ward;

Ik had dit gedeelte even neergelegd omdat ik er niet helemaal meer uitkwam.
Toch wil ik het weer gaan oppakken zodat ik verder kan met mijn website :)

Laten we eventjes beginnen met de stappen:

/artikel/

- ArticleController
- HeaderController
- NavigationController
- FooterView

Dit heb ik nodig wanneer ik /artikel/ opvraag.

Nu is de vraag waar handig ik dit af? Bijvoorbeeld het verhaal van de dispatch?
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.
@Ward;

Wat ik nu doe zal ik even proberen uit te leggen.

Alles wordt door gestuurd naar index.php.

Index.php

<?
            $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?
Tom Swinkels op 13/12/2013 17:54:09

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.
Precies, dit doet dus mijn frontController.


<?
    public function execute( $request )
    {
        $router = $this->getRouter();
        
        $route = $router->getRoute( $request->server( 'REDIRECT_URL' ) );
        if( $route ) 
        {
            $data = $route->getData();
            
            $controllerName = ucfirst( $data['controller'] ) . 'Controller';
            if( class_exists( $controllerName ) )
            {
                $controller = new $controllerName( $route );
                if( in_array( $data['action'], get_class_methods( $controllerName ) ) )
                {
                    $controller->$data['action']();
                    return true;
                }
            }
        }
    }
?>


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)

Of denk ik nu al verkeerd?
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?
Ik zou zeggen dat een ArticleController eigenlijk alleen een artikel toont... (daarom heet hij ook ArticleController).

Zou je er dan voor kiezen om een tussen controller te maken? ArticlePageController die dan de juiste controllers en views oproept?

Reageren