Correcte manier van aanroepen controllers

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Kevin ahrens

kevin ahrens

28/06/2012 08:12:00
Quote Anchor link
Beste mensen,
Ik ben bezig met een ViewController waarbij een template moet worden gemaakt. Met daarbij natuurlijk ook alle functies van de controller mogelijk moet zijn. Ik heb de volgende opbouw:

/
/application
/application/model
/application/controller
/application/view
/www

Ik heb in de view 2 bestanden: default.html en agenda.html
Ik heb in de controller 2 bestanden: ViewController.php en AgendaController.php
Ik heb in de model 2 bestanden: ViewModel.php en AgendaModel.php

Nu werkt dit allemaal prima! Ik krijg netjes de template van Agenda terug en de mogelijkheden binnen de Controller. Maar ik loop vast met de 'acties'. Het moet mogelijk zijn om straks: localhost/agenda/aanmaken te doen waarbij ik middel:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$this
->controller->$action;
?>


De actie op roep. Ik heb al een hele stuk! Maar er komt een error zodra ik juist GEEN action mee geef. Ik hoop dat iemand mij wat advies kan geven hoe ik dit het beste kan aanpakken! Het fout komt omdat ik een explode gebruik op de REQUEST_URI. Als ik dus geen 2 slashes heb dan geeft hij aan dat de variabel niet is mee gegeven.

Ik hoop dat iemand me gewoon wat advies kan geven op hoe ik dit het beste kan aanpakken en hoe ik dit netjes houdt!

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?php
class ViewController extends ViewModel
{
    public $master         = '';
    public $content     = '';

    /**
    * Get master template
    *
    * @return
    */

    public function __construct($template = 'master')
    {

        ob_start();
        
        include ROOT . '/view/' . $template . '.html';
        
        $this->master = ob_get_contents( );
        
        ob_end_clean( );
        
    }

    
    /**
    * Dispatch controller and action
    *
    * @return
    */

    public function dispatch ($controller, $action)
    {

    
        $controllername = ucfirst($controller) . 'Controller';
        
        if(class_exists($controllername)) {
            
            $this->controller = new $controllername ();
            
            if(in_array($action, get_class_methods($controllername))) {
                $this->controller-> $action ();
            }
        }
    }


    /**
    * Display template
    *
    * @return Strings
    */

    public function display()
    {

        $parts = explode('/', $_SERVER['REQUEST_URI']);
        
        $this->dispatch('Agenda', 'create');
        //$this->dispatch($parts[1], $parts[2]);
        // localhost/agenda/create

        
        ob_start( );
        
        if(file_exists(ROOT . '/view/' . $this->page . '.html'))
        {

            include ROOT . '/view/' . $this->page . '.html';
        }

        else
        {
            include ROOT . '/errors/404.html';
        }

        
        $this->content = ob_get_contents();
        
        
        ob_end_clean( );
        
        return str_replace('{{content}}', $this->content, $this->master);
    }
}

?>


Alvast bedankt.

Met vriendelijke groet,
Kevin Ahrens
 
PHP hulp

PHP hulp

15/05/2024 13:00:17
 
Wouter J

Wouter J

28/06/2012 09:14:42
Quote Anchor link
Door met routing aan de slag te gaan en een default route te maken die een controller en action aanroept die geldt voor de homepagina, iets als WelcomeController:indexAction.

Dit kan je op verschillende manieren doen:
- De manier die Pim hier mooi uitlegt
- De manier hoe ik het heb gedaan, zelfde als die van Pim maar dan wat uitgebreider: Route object, Route Repository object en de frontcontroller.
- Een microframework gebruiken voor routing, zoals Silex.
- Het Symfony Routing Component gebruiken.
- De Zend Router
 
John Cena

John Cena

28/06/2012 09:47:43
Quote Anchor link
De vraag die bij mij vooral rijst, waarom gebruik je niet een bestaand framework? Daar zitten deze functionaliteiten al in.

Zoals Wouter al aangeeft, Symphony & Zend hebben het zowieso, Silex ook blijkbaar.
 



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.