Correcte manier van aanroepen controllers
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:
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)
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
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);
}
}
?>
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
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
Zoals Wouter al aangeeft, Symphony & Zend hebben het zowieso, Silex ook blijkbaar.