Crearea funcțiilor personalizate

Adăugați cu ușurință funcții ajutătoare personalizate în șabloanele Latte. Apelați logica PHP direct în expresii pentru calcule, acces la servicii sau generarea de conținut dinamic, menținând șabloanele curate și puternice.

Ce sunt funcțiile?

Funcțiile în Latte vă permit să extindeți setul de funcții care pot fi apelate în cadrul expresiilor din șabloane ({...}). Le puteți considera ca funcții PHP personalizate disponibile doar în interiorul șabloanelor dvs. Latte. Acest lucru aduce mai multe avantaje:

Comoditate: Puteți defini logica ajutătoare (cum ar fi calcule, formatare sau acces la datele aplicației) și o puteți apela folosind o sintaxă simplă și familiară de funcție direct în șablon, la fel cum ați apela strlen() sau date() în PHP.

{var $userInitials = initials($userName)} {* ex. 'I. D.' *}

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

Fără poluarea spațiului global: Spre deosebire de definirea unei funcții globale reale în PHP, funcțiile Latte există doar în contextul randării șablonului. Nu trebuie să încărcați spațiul de nume global PHP cu ajutoare care sunt specifice doar șabloanelor.

Integrare cu logica aplicației: PHP callable din spatele unei funcții Latte poate fi orice – o funcție anonimă, o metodă statică sau o metodă de instanță. Acest lucru înseamnă că funcțiile dvs. din șabloane pot accesa cu ușurință serviciile aplicației, bazele de date, configurația sau orice altă logică necesară prin capturarea variabilelor (în cazul funcțiilor anonime) sau prin utilizarea dependency injection (în cazul obiectelor). Exemplul hasPermission de mai sus demonstrează clar acest lucru, apelând probabil în fundal un serviciu de autorizare.

Suprascrierea funcțiilor native (opțional): Puteți chiar defini o funcție Latte cu același nume ca o funcție PHP nativă. În șablon, versiunea dvs. personalizată va fi apelată în locul funcției originale. Acest lucru poate fi util pentru a oferi un comportament specific șablonului sau pentru a asigura o procesare consecventă (de exemplu, asigurarea că strlen este întotdeauna sigură pentru multibyte). Utilizați această funcție cu prudență pentru a evita neînțelegerile.

Implicit, Latte permite apelarea tuturor funcțiilor PHP native (dacă nu sunt restricționate de Sandbox). Funcțiile personalizate extind această bibliotecă încorporată cu nevoile specifice ale proiectului dvs.

Dacă transformați doar o singură valoare, ar putea fi mai potrivit să utilizați un filtru personalizat.

Crearea și înregistrarea funcțiilor

Similar filtrelor, există mai multe moduri de a defini și înregistra funcții personalizate.

Înregistrare directă folosind addFunction()

Cea mai simplă metodă este utilizarea addFunction() pe obiectul Latte\Engine. Specificați numele funcției (cum va apărea în șablon) și PHP callable corespunzător.

$latte = new Latte\Engine;

// Funcție ajutătoare simplă
$latte->addFunction('initials', function (string $name): string {
	preg_match_all('#\b\w#u', $name, $m);
	return implode('. ', $m[0]) . '.';
});

Utilizare în șablon:

{var $userInitials = initials($userName)}

Argumentele funcției din șablon sunt transmise direct PHP callable în aceeași ordine. Funcționalitățile PHP precum type hints, valori implicite și parametri variabili (...) funcționează conform așteptărilor.

Înregistrare prin extensie

Pentru o mai bună organizare și reutilizare, înregistrați funcțiile în cadrul unei extensii Latte. Această abordare este recomandată pentru aplicații mai complexe sau biblioteci partajate.

namespace App\Latte;

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

class MyLatteExtension extends Extension
{
	public function __construct(
		// Presupunem că serviciul Authorizator există
		private Authorizator $authorizator,
	) {
	}

	public function getFunctions(): array
	{
		// Înregistrarea metodelor ca funcții Latte
		return [
			'hasPermission' => $this->hasPermission(...),
		];
	}

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

// Înregistrare (presupunem că $container conține DIC)
$extension = $container->getByType(App\Latte\MyLatteExtension::class);
$latte = new Latte\Engine;
$latte->addExtension($extension);

Această abordare ilustrează cum funcțiile definite în Latte pot fi susținute de metode ale obiectelor, care pot avea propriile dependențe gestionate de containerul de dependency injection al aplicației dvs. sau de o fabrică. Acest lucru menține logica șabloanelor dvs. conectată la nucleul aplicației, păstrând în același timp o organizare clară.

Funcții care utilizează o clasă cu atribute

La fel ca filtrele, funcțiile pot fi definite ca metode în clasa dvs. de parametri de șablon folosind atributul #[Latte\Attributes\TemplateFunction].

use Latte\Attributes\TemplateFunction;

class TemplateParameters
{
	public function __construct(
		public string $userName,
		// alți parametri...
	) {}

	// Această metodă va fi disponibilă ca {initials(...)} în șablon
	#[TemplateFunction]
	public function initials(string $name): string
	{
		preg_match_all('#\b\w#u', $name, $m);
		return implode('. ', $m[0]) . '.';
	}
}

// Transmiterea obiectului către șablon
$params = new TemplateParameters(userName: 'John Doe', /* ... */);
$latte->render('template.latte', $params);

Latte va descoperi și înregistra automat metodele marcate cu acest atribut atunci când obiectul de parametri este transmis șablonului. Numele funcției în șablon corespunde numelui metodei.

{* Utilizarea funcției definite în clasa de parametri *}
{var $inits = initials($userName)}

Funcții contextuale?

Spre deosebire de filtre, nu există un concept direct de „funcții contextuale” care ar primi un obiect similar cu FilterInfo. Funcțiile operează în cadrul expresiilor și, de obicei, nu necesită acces direct la contextul de randare sau la informații despre tipul de conținut în același mod ca filtrele aplicate pe blocuri.

versiune: 3.0