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.