Signatur
Beschreibung
Yaf_View_Interface ist die zentrale Schnittstelle des Yet Another Framework (Yaf), über die eigene Template-Engines oder View-Renderer eingebunden werden können. Indem eine Klasse dieses Interface implementiert, kann sie die interne Yaf_View_Simple-Engine vollständig ersetzen.
Das Interface legt die Methoden fest, die das Yaf-Framework von einer View-Engine erwartet: Variablen zuweisen, den Template-Pfad setzen und abrufen sowie Templates rendern. Alle diese Methoden müssen implementiert werden, damit das Framework die eigene Engine korrekt einbinden und aufrufen kann.
Typische Anwendungsfälle sind die Integration von Template-Engines wie Twig, Smarty oder Blade in eine Yaf-Anwendung. Die eigene Klasse wird dann über Yaf_Dispatcher::setView() als aktive View-Engine gesetzt.
Da Yaf auf Performance ausgelegt ist, bietet dieses Interface einen leichtgewichtigen Vertrag ohne Overhead durch eine abstrakte Basisklasse. Die Implementierung hat vollständige Kontrolle über das Rendering-Verhalten.
Beispiele
Eigene View-Engine mit Twig über Yaf_View_Interface
<?php
use Twig\Environment;
use Twig\Loader\FilesystemLoader;
class TwigView implements Yaf_View_Interface
{
protected Environment $twig;
protected string $templateDir = '';
protected array $vars = [];
public function __construct(string $templateDir)
{
$this->templateDir = $templateDir;
$loader = new FilesystemLoader($templateDir);
$this->twig = new Environment($loader);
}
public function assign(string $name, mixed $value = null): bool
{
$this->vars[$name] = $value;
return true;
}
public function display(string $template, ?array $vars = null): bool
{
$data = array_merge($this->vars, $vars ?? []);
echo $this->twig->render($template, $data);
return true;
}
public function render(string $template, ?array $vars = null): string
{
$data = array_merge($this->vars, $vars ?? []);
return $this->twig->render($template, $data);
}
public function setScriptPath(string $templateDir): bool
{
$this->templateDir = $templateDir;
$loader = new FilesystemLoader($templateDir);
$this->twig = new Environment($loader);
return true;
}
public function getScriptPath(): string
{
return $this->templateDir;
}
}
// In der Bootstrap-Klasse registrieren:
class Bootstrap extends Yaf_Bootstrap_Abstract
{
public function _initView(Yaf_Dispatcher $dispatcher): void
{
$view = new TwigView(APPLICATION_PATH . '/views');
$dispatcher->setView($view);
}
}
Minimale View-Engine-Implementierung ohne externe Bibliothek
<?php
class SimpleCustomView implements Yaf_View_Interface
{
private string $scriptPath = '';
private array $vars = [];
public function assign(string $name, mixed $value = null): bool
{
$this->vars[$name] = $value;
return true;
}
public function render(string $template, ?array $vars = null): string
{
$all = array_merge($this->vars, $vars ?? []);
extract($all, EXTR_SKIP);
$file = rtrim($this->scriptPath, '/') . '/' . ltrim($template, '/');
if (!is_readable($file)) {
throw new RuntimeException("Template nicht lesbar: $file");
}
ob_start();
include $file;
return ob_get_clean();
}
public function display(string $template, ?array $vars = null): bool
{
echo $this->render($template, $vars);
return true;
}
public function setScriptPath(string $path): bool
{
$this->scriptPath = $path;
return true;
}
public function getScriptPath(): string
{
return $this->scriptPath;
}
}
$view = new SimpleCustomView();
$view->setScriptPath('/var/www/app/views');
$view->assign('title', 'Willkommen');
echo $view->render('index.php'); // gibt /var/www/app/views/index.php gerendert aus
// Wichtig · Fallstricke
Pflichtmethoden: Alle fünf Methoden (assign, display, render, setScriptPath, getScriptPath) müssen implementiert werden, sonst wirft PHP beim Instanziieren einen Fatal error.
Sicherheit: Beim Einsatz von extract() in eigenen View-Engines immer EXTR_SKIP verwenden, um das Überschreiben vorhandener Variablen durch manipulierte Template-Daten zu verhindern. Template-Pfade sollten niemals aus Benutzereingaben unkontrolliert übernommen werden (Path-Traversal-Gefahr).
Yaf-Erweiterung: Yaf ist eine PHP-C-Extension (pecl install yaf) und muss explizit installiert und in der php.ini aktiviert sein. Yaf_View_Interface existiert nur, wenn die Extension geladen ist.