Programy ładujące szablony

Loadery to mechanizm wykorzystywany przez Latte do pobierania kodu źródłowego szablonów. Najczęściej szablony są plikami przechowywanymi na dysku, ale elastyczny system ładowania Latte pozwala na ładowanie ich z praktycznie dowolnego miejsca, a nawet generowanie ich dynamicznie.

Co to jest Loader?

Zazwyczaj podczas pracy z szablonami myśli się o plikach .latte znajdujących się w strukturze katalogów projektu. Jest to obsługiwane przez domyślny FileLoader Latte. Jednak połączenie między nazwą szablonu (np. 'main.latte' lub 'components/card.latte') a jego rzeczywistą zawartością kodu źródłowego nie musi być bezpośrednim mapowaniem ścieżki pliku.

W tym miejscu pojawiają się loadery. Program ładujący jest obiektem odpowiedzialnym za pobranie nazwy szablonu (ciąg identyfikatora) i dostarczenie Latte jego kodu źródłowego. Latte całkowicie polega na skonfigurowanym programie ładującym. Dotyczy to nie tylko początkowego szablonu żądanego za pośrednictwem $latte->render('main.latte'), ale także każdego szablonu, do którego odwołuje się za pomocą tagów takich jak {include ...}, {layout ...}, {embed ...} lub {import ...}.

Dlaczego warto używać niestandardowego programu ładującego?

  • Wczytywanie z alternatywnych źródeł: Pobieranie szablonów przechowywanych w bazie danych, pamięci podręcznej (takiej jak Redis lub Memcached), systemie kontroli wersji (takim jak Git, na podstawie określonego zatwierdzenia) lub generowanych dynamicznie.
  • Wdrażanie niestandardowych konwencji nazewnictwa:** Możesz chcieć użyć krótszych aliasów dla szablonów lub zaimplementować określoną logikę ścieżki wyszukiwania (np. najpierw szukając w katalogu motywu, a następnie powracając do katalogu domyślnego).
  • Dodanie zabezpieczeń lub kontroli dostępu:** Niestandardowy program ładujący może weryfikować uprawnienia użytkownika przed załadowaniem niektórych szablonów.
  • Preprocessing: Choć generalnie jest to odradzane(kompilatory są lepsze), program ładujący mógłby teoretycznie wstępnie przetworzyć zawartość szablonu przed przekazaniem go do Latte.

Program ładujący dla instancji Latte\Engine konfiguruje się za pomocą metody setLoader():

$latte = new Latte\Engine;

// Użyj domyślnego FileLoadera dla plików w '/path/to/templates'
$loader = new Latte\Loaders\FileLoader('/path/to/templates');
$latte->setLoader($loader);

Program ładujący musi implementować interfejs Latte\Loader.

Wbudowane programy ładujące

Latte oferuje kilka standardowych ładowarek:

FileLoader

Jest to domyślny program ładujący używany przez Latte\Engine, jeśli nie określono innego programu ładującego. Ładuje szablony bezpośrednio z systemu plików.

Opcjonalnie można ustawić katalog główny, aby ograniczyć dostęp:

use Latte\Loaders\FileLoader;

// Poniższe rozwiązanie pozwoli na ładowanie szablonów tylko w obrębie /var/www/html/templates
$loader = new FileLoader('/var/www/html/templates');
$latte->setLoader($loader);

// $latte->render('../../../etc/passwd'); // Spowoduje to zgłoszenie wyjątku.

// Renderowanie szablonu znajdującego się w /var/www/html/templates/pages/contact.latte
$latte->render('pages/contact.latte');

Rozwiązuje nazwy szablonów względem bieżącego szablonu, gdy używane są znaczniki takie jak {include} lub {layout}, chyba że podano ścieżkę bezwzględną.

StringLoader

Ten program ładujący pobiera zawartość szablonu z tablicy asocjacyjnej, w której kluczami są nazwy szablonów (identyfikatory), a wartościami są ciągi kodu źródłowego szablonu. Jest to szczególnie przydatne do testowania lub małych aplikacji, w których szablony mogą być przechowywane w samym kodzie PHP.

use Latte\Loaders\StringLoader;

$loader = new StringLoader([
	'main.latte' => 'Hello {$name}, include is below:{include helper.latte}',
	'helper.latte' => '{var $x = 10}Included content: {$x}',
	// Dodaj więcej szablonów w razie potrzeby
]);

$latte->setLoader($loader);

$latte->render('main.latte', ['name' => 'World']);
// Dane wyjściowe: Hello World, include znajduje się poniżej:Included content: 10

Jeśli potrzebujesz tylko wyrenderować pojedynczy szablon bezpośrednio z ciągu znaków, bez potrzeby dołączania lub dziedziczenia odwołań do innych nazwanych szablonów ciągów znaków, możesz przekazać ciąg znaków bezpośrednio do render() lub renderToString(), gdy używasz StringLoader bez tablicy:

$loader = new StringLoader;
$latte->setLoader($loader);

$templateString = 'Hello {$name}!';
$output = $latte->renderToString($templateString, ['name' => 'Alice']);
// $output zawiera 'Hello Alice!'

Tworzenie niestandardowego programu ładującego

Aby utworzyć własny program ładujący (np. w celu załadowania szablonów z bazy danych, pamięci podręcznej, kontroli wersji lub innego źródła), należy utworzyć klasę implementującą interfejs Latte\Loader.

Przyjrzyjmy się, co każda metoda musi zrobić.

getContent (string $name)string

Jest to podstawowa metoda programu ładującego. Jej zadaniem jest pobranie i zwrócenie pełnej zawartości kodu źródłowego szablonu zidentyfikowanego przez $name (przekazanego do $latte->render() lub zwróconego przez getReferredName()).

Jeśli nie można znaleźć szablonu lub uzyskać do niego dostępu, ta metoda musi rzucić Latte\RuntimeException.

public function getContent(string $name): string
{
	// Przykład: Pobieranie z hipotetycznej pamięci wewnętrznej
	$content = $this->storage->read($name);
	if ($content === null) {
		throw new Latte\RuntimeException("Template '$name' cannot be loaded.");
	}
	return $content;
}

getReferredName (string $name, string $referringName)string

Ta metoda obsługuje rozwiązywanie nazw szablonów używanych w tagach, takich jak {include}, {layout}, itp. Kiedy Latte napotka, na przykład, {include 'partial.latte'} wewnątrz main.latte, wywołuje tę metodę z $name = 'partial.latte' i $referringName = 'main.latte'.

Zadaniem tej metody jest przekształcenie $name w kanoniczny identyfikator (np. bezwzględną ścieżkę, unikalny klucz bazy danych), który będzie używany podczas wywoływania innych metod ładujących, w oparciu o kontekst dostarczony przez $referringName.

public function getReferredName(string $name, string $referringName): string
{
	return ...;
}

getUniqueId (string $name)string

Latte używa skompilowanej pamięci podręcznej szablonów w celu zwiększenia wydajności. Każdy skompilowany plik szablonu wymaga unikalnej nazwy pochodzącej z identyfikatora szablonu źródłowego. Ta metoda zapewnia ciąg znaków, który jednoznacznie identyfikuje szablon $name.

W przypadku szablonów opartych na plikach może działać ścieżka bezwzględna. W przypadku szablonów baz danych powszechne jest połączenie prefiksu i identyfikatora bazy danych.

public function getUniqueId(string $name): string
{
	return ...;
}

Przykład: Prosty program ładujący bazę danych

Ten przykład demonstruje podstawową strukturę programu ładującego pobierającego szablony przechowywane w tabeli bazy danych o nazwie templates z kolumnami name (unikalny identyfikator), content i updated_at.

use Latte;

class DatabaseLoader implements Latte\Loader
{
	public function __construct(
		private \PDO $db,
	) {
	}

	public function getContent(string $name): string
	{
		$stmt = $this->db->prepare('SELECT content FROM templates WHERE name = ?');
		$stmt->execute([$name]);
		$content = $stmt->fetchColumn();
		if ($content === false) {
			throw new Latte\RuntimeException("Template '$name' not found in database.");
		}
		return $content;
	}

	// Ten prosty przykład zakłada, że nazwy szablonów ("strona główna", "artykuł" itp.)
	// są unikalnymi identyfikatorami, a szablony nie odnoszą się do siebie nawzajem.
	public function getReferredName(string $name, string $referringName): string
	{
		return $name;
	}

	public function getUniqueId(string $name): string
	{
		// Użycie prefiksu i samej nazwy jest tutaj unikalne i wystarczające
		return 'db_' . $name;
	}
}

// Użycie:
$pdo = new \PDO(/* connection details */);
$loader = new DatabaseLoader($pdo);
$latte->setLoader($loader);
$latte->render('homepage'); // Ładuje szablon o nazwie 'homepage' z bazy danych

Niestandardowe programy ładujące zapewniają pełną kontrolę nad tym, skąd pochodzą szablony Latte, umożliwiając integrację z różnymi systemami pamięci masowej i przepływami pracy.

wersja: 3.0