Ö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.