Loaderek

A loaderek az a mechanizmus, amelyet a Latte használ a sablonok forráskódjának lekérésére. Leggyakrabban a sablonok fájlokként vannak tárolva a lemezen, de a rugalmas loader rendszernek köszönhetően gyakorlatilag bárhonnan betöltheti őket, vagy akár dinamikusan is generálhatja.

Mi az a Loader?

Amikor sablonokkal dolgozik, általában a projekt könyvtárstruktúrájában elhelyezett .latte fájlokra gondol. Erről gondoskodik az alapértelmezett FileLoader a Latte-ban. Azonban a sablon neve (mint 'main.latte' vagy 'components/card.latte') és a tényleges forráskódja közötti kapcsolat nem feltétlenül közvetlen leképezés egy fájlútvonalra.

Itt jönnek képbe a loaderek. A loader egy objektum, amelynek feladata, hogy vegyen egy sablonnevet (egy azonosító stringet), és biztosítsa a Latte számára annak forráskódját. A Latte ebben a feladatban teljes mértékben a konfigurált loaderre támaszkodik. Ez nemcsak a $latte->render('main.latte')-val kért kezdeti sablonra vonatkozik, hanem minden belülről hivatkozott sablonra is, olyan tagekkel, mint {include ...}, {layout ...}, {embed ...} vagy {import ...}.

Miért használna egyéni loadert?

  • Betöltés alternatív forrásokból: Sablonok lekérése adatbázisból, gyorsítótárból (mint Redis vagy Memcached), verziókezelő rendszerből (mint Git, egy konkrét commit alapján) vagy dinamikusan generáltak.
  • Egyéni elnevezési konvenciók implementálása: Lehet, hogy rövidebb aliasokat szeretne használni a sablonokhoz, vagy egy specifikus keresési útvonal logikát implementálna (pl. először a téma könyvtárában keres, majd visszatér az alapértelmezett könyvtárhoz).
  • Biztonság vagy hozzáférés-vezérlés hozzáadása: Egy egyéni loader ellenőrizheti a felhasználói jogosultságokat bizonyos sablonok betöltése előtt.
  • Előfeldolgozás: Bár általában nem ajánlott (fordítási menetek jobbak), egy loader elméletileg előfeldolgozhatná a sablon tartalmát, mielőtt átadná a Latte-nak.

A Latte\Engine példányhoz tartozó loadert a setLoader() metódussal állíthatja be:

$latte = new Latte\Engine;

// Az alapértelmezett FileLoader használata a '/path/to/templates' fájlokhoz
$loader = new Latte\Loaders\FileLoader('/path/to/templates');
$latte->setLoader($loader);

A loadernek implementálnia kell a Latte\Loader interfészt.

Beépített Loaderek

A Latte több standard loadert kínál:

FileLoader

Ez az alapértelmezett loader, amelyet a Latte\Engine osztály használ, ha nincs más megadva. Közvetlenül a fájlrendszerből tölti be a sablonokat.

Opcionálisan beállíthat egy gyökérkönyvtárat a hozzáférés korlátozására:

use Latte\Loaders\FileLoader;

// A következő csak a /var/www/html/templates könyvtárból engedélyezi a sablonok betöltését
$loader = new FileLoader('/var/www/html/templates');
$latte->setLoader($loader);

// $latte->render('../../../etc/passwd'); // Ez kivételt dobna

// A /var/www/html/templates/pages/contact.latte helyen található sablon renderelése
$latte->render('pages/contact.latte');

Az olyan tagek használatakor, mint {include} vagy {layout}, a sablonneveket relatívan oldja fel az aktuális sablonhoz képest, hacsak nincs abszolút útvonal megadva.

StringLoader

Ez a loader a sablon tartalmát egy asszociatív tömbből szerzi be, ahol a kulcsok a sablonnevek (azonosítók), az értékek pedig a sablon forráskód stringjei. Különösen hasznos teszteléshez vagy kis alkalmazásokhoz, ahol a sablonok közvetlenül a PHP kódban tárolhatók.

use Latte\Loaders\StringLoader;

$loader = new StringLoader([
	'main.latte' => 'Helló {$name}, az include lentebb van:{include helper.latte}',
	'helper.latte' => '{var $x = 10}Beillesztett tartalom: {$x}',
	// Adjon hozzá további sablonokat szükség szerint
]);

$latte->setLoader($loader);

$latte->render('main.latte', ['name' => 'Világ']);
// Kimenet: Helló Világ, az include lentebb van:Beillesztett tartalom: 10

Ha csak egyetlen sablont kell közvetlenül egy stringből renderelnie, anélkül, hogy beágyazásra vagy öröklődésre lenne szüksége, amely más névvel ellátott string sablonokra hivatkozik, átadhatja a stringet közvetlenül a render() vagy renderToString() metódusnak, amikor a StringLoader-t tömb nélkül használja:

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

$templateString = 'Helló {$name}!';
$output = $latte->renderToString($templateString, ['name' => 'Alice']);
// $output tartalmazza: 'Helló Alice!'

Egyéni Loader létrehozása

Egyéni loader létrehozásához (pl. sablonok betöltése adatbázisból, gyorsítótárból, verziókezelő rendszerből vagy más forrásból) létre kell hoznia egy osztályt, amely implementálja a Latte\Loader interfészt.

Nézzük meg, mit kell tennie minden metódusnak.

getContent (string $name)string

Ez a loader alapvető metódusa. Feladata a $name által azonosított sablon teljes forráskódjának lekérése és visszaadása (ahogy a $latte->render() metódusnak átadták, vagy a getReferredName() metódus visszaadta).

Ha a sablont nem lehet megtalálni vagy hozzáférni, ez a metódus Latte\RuntimeException kivételt kell, hogy dobjon.

public function getContent(string $name): string
{
	// Példa: Betöltés egy hipotetikus belső tárolóból
	$content = $this->storage->read($name);
	if ($content === null) {
		throw new Latte\RuntimeException("A(z) '$name' sablon nem tölthető be.");
	}
	return $content;
}

getReferredName (string $name, string $referringName)string

Ez a metódus kezeli a sablonnevek feloldását, amelyeket olyan tagekben használnak, mint {include}, {layout}, stb. Amikor a Latte például találkozik egy {include 'partial.latte'} taggel a main.latte-n belül, meghívja ezt a metódust $name = 'partial.latte' és $referringName = 'main.latte' értékekkel.

A metódus feladata a $name lefordítása egy kanonikus azonosítóra (pl. abszolút útvonal, egyedi adatbázis kulcs), amelyet a loader további metódusainak hívásakor használnak, a $referringName-ben megadott kontextus alapján.

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

getUniqueId (string $name)string

A Latte a teljesítmény javítása érdekében a fordított sablonok gyorsítótárát használja. Minden fordított sablonfájlnak egyedi névre van szüksége, amely a forrássablon azonosítójából származik. Ez a metódus egy stringet biztosít, amely egyértelműen azonosítja a $name sablont.

Fájl alapú sablonok esetén az abszolút útvonal szolgálhat erre. Adatbázisban lévő sablonok esetén gyakori egy előtag és az adatbázis ID kombinációja.

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

Példa: Egyszerű adatbázis Loader

Ez a példa egy olyan loader alapvető struktúráját mutatja be, amely egy templates nevű adatbázis táblában tárolt sablonokat tölt be, name (egyedi azonosító), content és updated_at oszlopokkal.

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("A(z) '$name' sablon nem található az adatbázisban.");
		}
		return $content;
	}

	// Ez az egyszerű példa feltételezi, hogy a sablonnevek ('homepage', 'article', stb.)
	// egyedi ID-k, és a sablonok nem hivatkoznak egymásra relatívan.
	public function getReferredName(string $name, string $referringName): string
	{
		return $name;
	}

	public function getUniqueId(string $name): string
	{
		// Az előtag és maga a név használata itt egyedi és elegendő
		return 'db_' . $name;
	}
}

// Használat:
$pdo = new \PDO(/* csatlakozási részletek */);
$loader = new DatabaseLoader($pdo);
$latte->setLoader($loader);
$latte->render('homepage'); // Betölti a 'homepage' nevű sablont az DB-ből

Az egyéni loaderek teljes kontrollt adnak Önnek afölött, honnan származnak a Latte sablonjai, lehetővé téve az integrációt különböző tárolórendszerekkel és munkafolyamatokkal.

verzió: 3.0