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ć.