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.