Egyéni függvények létrehozása

Könnyedén adjon hozzá egyéni segédfüggvényeket a Latte sablonokhoz. Hívjon PHP logikát közvetlenül a kifejezésekben számításokhoz, szolgáltatások eléréséhez vagy dinamikus tartalom generálásához, ami tisztán és hatékonyan tartja a sablonjait.

Mik azok a függvények?

A Latte függvényei lehetővé teszik a sablonokban ({...}) a kifejezéseken belül hívható függvények körének kibővítését. Úgy gondolhat rájuk, mint egyéni PHP függvényekre, amelyek csak a Latte sablonokon belül érhetők el. Ez számos előnnyel jár:

Kényelem: Definiálhat segédlogikát (mint számítások, formázás vagy alkalmazásadatok elérése), és egyszerű, ismerős függvényszintaxissal hívhatja meg közvetlenül a sablonban, ugyanúgy, ahogy a strlen()-t vagy a date()-t hívná PHP-ban.

{var $userInitials = initials($userName)} {* pl. 'J. D.' *}

{if hasPermission('article', 'edit')}
    <a href="...">Szerkesztés</a>
{/if}

Nincs globális tér szennyezése: Ellentétben egy valódi globális függvény definiálásával PHP-ban, a Latte függvények csak a sablon renderelési kontextusában léteznek. Nem kell terhelnie a PHP globális névterét olyan segédfüggvényekkel, amelyek csak a sablonokhoz specifikusak.

Integráció az alkalmazáslogikával: A Latte függvény mögött álló PHP callable bármi lehet – anonim függvény, statikus metódus vagy példány metódus. Ez azt jelenti, hogy a sablonfüggvényei könnyen hozzáférhetnek az alkalmazás szolgáltatásaihoz, adatbázisaihoz, konfigurációjához vagy bármely más szükséges logikához változók rögzítésével (anonim függvények esetén) vagy dependency injection használatával (objektumok esetén). A fenti hasPermission példa ezt világosan demonstrálja, amikor valószínűleg egy jogosultságkezelő szolgáltatást hív a háttérben.

Natív függvények felülírása (opcionális): Még egy Latte függvényt is definiálhat ugyanazzal a névvel, mint egy natív PHP függvény. A sablonban a saját verziója lesz meghívva az eredeti függvény helyett. Ez hasznos lehet sablon-specifikus viselkedés biztosítására vagy konzisztens feldolgozás biztosítására (pl. annak biztosítása, hogy a strlen mindig több bájtos biztonságú legyen). Ezt a funkciót óvatosan használja a félreértések elkerülése érdekében.

Alapértelmezés szerint a Latte minden natív PHP függvény hívását engedélyezi (hacsak a Sandbox nem korlátozza). Az egyéni függvények kibővítik ezt a beépített könyvtárat a projekt specifikus igényeivel.

Ha csak egyetlen értéket alakít át, lehet, hogy megfelelőbb egy egyéni szűrő használata.

Függvények létrehozása és regisztrálása

Hasonlóan a szűrőkhöz, több módja van az egyéni függvények definiálásának és regisztrálásának.

Közvetlen regisztráció az addFunction() segítségével

A legegyszerűbb módszer az addFunction() használata a Latte\Engine objektumon. Megadja a függvény nevét (ahogyan a sablonban megjelenik) és a megfelelő PHP callable objektumot.

$latte = new Latte\Engine;

// Egyszerű segédfüggvény
$latte->addFunction('initials', function (string $name): string {
	preg_match_all('#\b\w#u', $name, $m);
	return implode('. ', $m[0]) . '.';
});

Használat a sablonban:

{var $userInitials = initials($userName)}

A sablonban lévő függvény argumentumai közvetlenül a PHP callable objektumnak kerülnek átadásra ugyanabban a sorrendben. A PHP funkciók, mint a típusjelzések, alapértelmezett értékek és variadikus paraméterek (...), a várt módon működnek.

Regisztráció bővítményen keresztül

A jobb szervezés és újrafelhasználhatóság érdekében regisztrálja a függvényeket egy Latte bővítményben. Ez a megközelítés ajánlott összetettebb alkalmazásokhoz vagy megosztott könyvtárakhoz.

namespace App\Latte;

use Latte\Extension;
use Nette\Security\Authorizator;

class MyLatteExtension extends Extension
{
	public function __construct(
		// Feltételezzük, hogy az Authorizator szolgáltatás létezik
		private Authorizator $authorizator,
	) {
	}

	public function getFunctions(): array
	{
		// Metódusok regisztrálása Latte függvényként
		return [
			'hasPermission' => $this->hasPermission(...),
		];
	}

	public function hasPermission(string $resource, string $action): bool
	{
		return $this->authorizator->isAllowed($resource, $action);
	}
}

// Regisztráció (feltételezzük, hogy a $container tartalmazza a DIC-t)
$extension = $container->getByType(App\Latte\MyLatteExtension::class);
$latte = new Latte\Engine;
$latte->addExtension($extension);

Ez a megközelítés jól szemlélteti, hogyan támogathatják a Latte-ban definiált függvényeket olyan objektumok metódusai, amelyeknek saját függőségeik lehetnek, amelyeket az alkalmazás dependency injection konténere vagy factory-ja kezel. Ez összekapcsolja a sablonok logikáját az alkalmazás magjával, miközben megőrzi a tiszta szervezést.

Függvények osztály használatával attribútumokkal

Mint a szűrők, a függvények is definiálhatók metódusként a sablon paraméter osztályában a #[Latte\Attributes\TemplateFunction] attribútum használatával.

use Latte\Attributes\TemplateFunction;

class TemplateParameters
{
	public function __construct(
		public string $userName,
		// további paraméterek...
	) {}

	// Ez a metódus elérhető lesz mint {initials(...)} a sablonban
	#[TemplateFunction]
	public function initials(string $name): string
	{
		preg_match_all('#\b\w#u', $name, $m);
		return implode('. ', $m[0]) . '.';
	}
}

// Objektum átadása a sablonnak
$params = new TemplateParameters(userName: 'John Doe', /* ... */);
$latte->render('template.latte', $params);

A Latte automatikusan felfedezi és regisztrálja az ezzel az attribútummal megjelölt metódusokat, amikor a paraméter objektumot átadják a sablonnak. A függvény neve a sablonban megegyezik a metódus nevével.

{* A paraméter osztályban definiált függvény használata *}
{var $inits = initials($userName)}

Kontextusérzékeny függvények?

Ellentétben a szűrőkkel, nincs közvetlen “kontextusérzékeny függvény” koncepció, amely egy FilterInfo-hoz hasonló objektumot kapna. A függvények a kifejezéseken belül működnek, és általában nincs szükségük közvetlen hozzáférésre a renderelési kontextushoz vagy a tartalomtípus információkhoz ugyanúgy, mint a blokkokra alkalmazott szűrőknek.

verzió: 3.0