Özel Fonksiyonlar Oluşturma

Latte şablonlarına kolayca özel yardımcı fonksiyonlar ekleyin. Hesaplamalar, servislere erişim veya dinamik içerik oluşturma için ifadeler içinde doğrudan PHP mantığını çağırın, bu da şablonlarınızı temiz ve güçlü tutar.

Fonksiyonlar Nedir?

Latte'deki fonksiyonlar, şablonlardaki ifadeler ({...}) içinde çağrılabilecek fonksiyon setini genişletmenizi sağlar. Bunları yalnızca Latte şablonlarınızın içinde kullanılabilen özel PHP fonksiyonları olarak düşünebilirsiniz. Bu birkaç avantaj sağlar:

Kolaylık: Yardımcı mantığı (hesaplamalar, biçimlendirme veya uygulama verilerine erişim gibi) tanımlayabilir ve PHP'de strlen() veya date() çağırır gibi, şablonda doğrudan basit, tanıdık fonksiyon sözdizimiyle çağırabilirsiniz.

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

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

Küresel Alanı Kirletmeme: PHP'de gerçek bir küresel fonksiyon tanımlamanın aksine, Latte fonksiyonları yalnızca şablon oluşturma bağlamında bulunur. PHP küresel ad alanını yalnızca şablonlara özgü yardımcılarla doldurmanız gerekmez.

Uygulama Mantığı ile Entegrasyon: Bir Latte fonksiyonunun arkasındaki PHP çağrılabilir nesnesi herhangi bir şey olabilir – anonim bir fonksiyon, statik bir metot veya bir örnek metodu. Bu, şablonlarınızdaki fonksiyonların, değişkenleri yakalayarak (anonim fonksiyonlar durumunda) veya bağımlılık enjeksiyonu kullanarak (nesneler durumunda) uygulama servislerine, veritabanlarına, yapılandırmaya veya başka herhangi bir gerekli mantığa kolayca erişebileceği anlamına gelir. Yukarıdaki hasPermission örneği, muhtemelen arka planda bir yetkilendirme servisini çağırdığında bunu açıkça gösterir.

Yerel Fonksiyonları Geçersiz Kılma (İsteğe Bağlı): Hatta yerel bir PHP fonksiyonuyla aynı ada sahip bir Latte fonksiyonu tanımlayabilirsiniz. Şablonda, orijinal fonksiyon yerine kendi sürümünüz çağrılır. Bu, şablona özgü davranış sağlamak veya tutarlı işlemeyi sağlamak için yararlı olabilir (örneğin, strlen'in her zaman çok baytlı güvenli olmasını sağlamak). Yanlış anlaşılmaları önlemek için bu özelliği dikkatli kullanın.

Varsayılan olarak Latte, tüm yerel PHP fonksiyonlarının çağrılmasına izin verir (Sandbox tarafından kısıtlanmadıkça). Özel fonksiyonlar, projenizin özel ihtiyaçları için bu yerleşik kütüphaneyi genişletir.

Yalnızca tek bir değeri dönüştürüyorsanız, özel bir filtre kullanmak daha uygun olabilir.

Fonksiyon Oluşturma ve Kaydetme

Filtrelerde olduğu gibi, özel fonksiyonları tanımlamanın ve kaydetmenin birkaç yolu vardır.

addFunction() ile Doğrudan Kayıt

En basit yöntem, Latte\Engine nesnesinde addFunction() kullanmaktır. Fonksiyon adını (şablonda nasıl görüneceğini) ve karşılık gelen PHP çağrılabilir nesnesini belirtirsiniz.

$latte = new Latte\Engine;

// Basit yardımcı fonksiyon
$latte->addFunction('initials', function (string $name): string {
	preg_match_all('#\b\w#u', $name, $m);
	return implode('. ', $m[0]) . '.';
});

Şablonda Kullanım:

{var $userInitials = initials($userName)}

Şablondaki fonksiyon argümanları, doğrudan PHP çağrılabilir nesnesine aynı sırada geçirilir. Tip ipuçları, varsayılan değerler ve değişken parametreler (...) gibi PHP işlevleri beklendiği gibi çalışır.

Uzantı ile Kayıt

Daha iyi organizasyon ve yeniden kullanılabilirlik için, fonksiyonları bir Latte uzantısı içinde kaydedin. Bu yaklaşım, daha karmaşık uygulamalar veya paylaşılan kütüphaneler için önerilir.

namespace App\Latte;

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

class MyLatteExtension extends Extension
{
	public function __construct(
		// Authorizator servisinin var olduğunu varsayıyoruz
		private Authorizator $authorizator,
	) {
	}

	public function getFunctions(): array
	{
		// Metotları Latte fonksiyonları olarak kaydetme
		return [
			'hasPermission' => $this->hasPermission(...),
		];
	}

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

// Kayıt (konteynerin DIC içerdiğini varsayıyoruz)
$extension = $container->getByType(App\Latte\MyLatteExtension::class);
$latte = new Latte\Engine;
$latte->addExtension($extension);

Bu yaklaşım, Latte'de tanımlanan fonksiyonların, uygulamanızın bağımlılık enjeksiyon konteyneri veya bir fabrika tarafından yönetilen kendi bağımlılıklarına sahip olabilen nesne metotları tarafından nasıl desteklenebileceğini gösterir. Bu, şablonlarınızın mantığını uygulamanın çekirdeğiyle bağlantılı tutarken temiz bir organizasyon sağlar.

Niteliklere Sahip Bir Sınıf Kullanan Fonksiyonlar

Filtreler gibi, fonksiyonlar da şablon parametre sınıfınızdaki yöntemler olarak #[Latte\Attributes\TemplateFunction] niteliği kullanılarak tanımlanabilir.

use Latte\Attributes\TemplateFunction;

class TemplateParameters
{
	public function __construct(
		public string $userName,
		// diğer parametreler...
	) {}

	// Bu metot şablonda {initials(...)} olarak kullanılabilir olacak
	#[TemplateFunction]
	public function initials(string $name): string
	{
		preg_match_all('#\b\w#u', $name, $m);
		return implode('. ', $m[0]) . '.';
	}
}

// Nesneyi şablona geçirme
$params = new TemplateParameters(userName: 'John Doe', /* ... */);
$latte->render('template.latte', $params);

Latte, parametre nesnesi şablona geçirildiğinde bu nitelikle işaretlenmiş yöntemleri otomatik olarak keşfeder ve kaydeder. Şablondaki fonksiyon adı, yöntem adıyla eşleşir.

{* Parametre sınıfında tanımlanan fonksiyonu kullanma *}
{var $inits = initials($userName)}

Bağlamsal Fonksiyonlar?

Filtrelerin aksine, FilterInfo benzeri bir nesne alacak “bağlamsal fonksiyonlar” için doğrudan bir kavram yoktur. Fonksiyonlar ifadeler içinde çalışır ve genellikle bloklara uygulanan filtreler gibi oluşturma bağlamına veya içerik türü bilgilerine doğrudan erişime ihtiyaç duymazlar.

versiyon: 3.0