Rozbudowa TemplateEngine do naszego projektu MVC. Dodajemy parsowanie różnych tagów. Do dzieła.
Najpierw plik sth2.php:
<h1>{{ $site_name }}</h1>
<p> Hello [b]{{ $name }}[/b]</p>
Teraz dodajemy statyczne property ze wzorami oraz metodę je parsującą:
<?php
class TemplateEngine
{
private array $globalTemplateData = [];
protected static $patterns = [
[
"pattern" => '/\{\{\s*(\$.*?)\s*\}\}/',
"replace" => "<?php echo $1; ?>"
],
[
"pattern" => '/\[b\](.*?)\[\/b\]/s',
"replace" => "<b>$1</b>"
]
];
public static function searchAndReplace($source){
foreach(self::$patterns as $pattern ){
$source = preg_replace($pattern['pattern'], $pattern['replace'], $source);
}
return $source;
}
}
Wykorzystujemy wzory i metodę w funkcji renderTemplate:
class TemplateEngine
{
//(...)
public function renderTemplate(string $template, array $data = []){
extract($data, EXTR_SKIP);
extract($this->globalTemplateData, EXTR_SKIP);
$content = file_get_contents($this->resolve($template));
$content = static::searchAndReplace($content);
eval( '?>' . $content );
}
//(...)
}
}
Możemy sprawdzić, jak to działa:
$template = new TemplateEngine(__DIR__);
$template->addGlobal('site_name', 'MyApp');
echo $template->renderTemplate('sth2.php', ['name' => 'John']);
Engine będziemy rozbudowywać.