Datenübergabe vom Controller zur View
Zum jetzigen Zeitpunkt ist unser Controller leider recht sinnlos. Text ausgeben soll er ja nicht und die View macht was sie will. Wir benötigen also eine Möglichkeit vom Controller aus Daten zur View zu bringen.
Wir erweitern dazu die View-Klasse um einen Container für Variablen und einen Setter.
1 2 3 4 5 6 |
public function setVars(array $vars) { foreach ($vars as $key => $val) { $this->vars[$key] = $val; } } |
Über einen Setter im Controller machen wir die View zugänglich. Damit kann der Controller nun beliebige Daten weitergeben – was wir in der indexAction
auch gleich nutzen werden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class IndexController implements Controller { /** @var \Mvc\Library\View */ protected $view; public function setView(\Mvc\Library\View $view) { $this->view = $view; } public function indexAction() { $this->view->setVars([ 'name' => 'Stefan', ]); } } |
Im Prinzip war’s das schon. Im Layout kann jetzt mit
1 |
<h1>Hello <?php echo $this->vars['name'] ?></h1> |
auf die Variablen zugegriffen werden.
Das ist allerdings eine Menge Schreibarbeit, die wir etwas verkürzen können. PHP erlaubt variable Variablennamen, was wir hier ausnahmsweise mal in der render()
nutzen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public function render() { $fileName = $this->path.DIRECTORY_SEPARATOR.$this->controller.DIRECTORY_SEPARATOR.$this->action.'.phtml'; if (!file_exists($fileName)) { throw new NotFoundException(); } // spare the view the bloat of using "$this->vars[]" for every variable foreach ($this->vars as $key => $val) { $$key = $val; } include $fileName; } |
Jetzt kann in der View die Variable direkt verwendet werden.
1 |
<h1>Hello <?php echo $name ?></h1> |
Die Variablen werden im Kontext der render()
Methode definiert. Da der include
Befehl ebenfalls in diesem Kontext erfolgt, sind die Variablen innerhalb der View verfügbar.
Der vollständige Code bis hierher (v0.3)
Was wäre nun die Möglichkeit dynamischer Inhalte ohne ein geeignetes Speichermedium. Genau darum geht es beim Model: Weiter mit Model