Piszemy TemplateEngine dla naszego projektu MVC. Zaczynamy od czegoś łatwego i stopniowo rozbudowujemy. Do dzieła.

Nasz plik sth.php:

<?php
echo $name;

Nasz plik dołączający ten template:

<?php 
extract(array("name" => "John"));
require __DIR__ . "/sth.php";

Tak to działa. Teraz spróbujmy napisać klasę w innym pliku:

<?php 

class TemplateEngine
{
  

  public function __construct(private string $basePath)
  {
  }

  //(...)

  public function resolve(string $path)
  {
    return "{$this->basePath}/{$path}";
  }

}

$template = new TemplateEngine(__DIR__);

Podstawowe metody pomocnicze mamy. Widzimy, jak to będzie działać. Pora na metodę resolve:

<?php 

class TemplateEngine
{
  

  //(...)

  public function render(string $template, array $data = [])
  {
    extract($data, EXTR_SKIP);
    

    ob_start();

    include $this->resolve($template);

    $output = ob_get_contents();

    ob_end_clean();

    return $output;
  }

  //(...)

}

Zwróćmy uwagę, że wykorzystaliśmy output buffering oraz, że zwracamy tekst, nie wyświetlamy:

$template = new TemplateEngine(__DIR__);
echo $template->render('sth.php', ['name' => 'John']);

Rozbudowa w następnym odcinku.