Şablon Yükleyiciler
Yükleyiciler, Latte'nin şablonlarınızın kaynak kodunu almak için kullandığı mekanizmadır. Genelde şablonlar diskte depolanan dosyalardır, ancak Latte'nin esnek yükleyici sistemi bunları neredeyse her yerden yüklemenize ve hatta dinamik olarak oluşturmanıza olanak tanır.
Yükleyici nedir?
Tipik olarak, şablonlarla çalıştığınızda, projenizin dizin yapısında bulunan .latte
dosyalarını
düşünürsünüz. Bu Latte'nin varsayılan FileLoader'ı tarafından gerçekleştirilir. Ancak,
bir şablon adı ( 'main.latte'
veya 'components/card.latte'
gibi) ile gerçek kaynak kodu içeriği
arasındaki bağlantı doğrudan bir dosya yolu eşlemesi olmak zorunda değildir.
İşte bu noktada yükleyiciler devreye girer. Yükleyici, bir şablon adını (bir tanımlayıcı dizesi) almaktan ve Latte'ye
kaynak kodunu sağlamaktan sorumlu bir nesnedir. Latte bu görev için tamamen yapılandırılmış yükleyiciye güvenir. Bu
sadece $latte->render('main.latte')
aracılığıyla talep edilen ilk şablon için değil, aynı zamanda
{include ...}
, {layout ...}
, {embed ...}
veya {import ...}
gibi etiketler
kullanılarak içinde referans verilen her şablon için de geçerlidir.
Neden özel bir yükleyici kullanmalı?
- Alternatif kaynaklardan yükleme:** Bir veritabanında, bir önbellekte (Redis veya Memcached gibi), bir sürüm kontrol sisteminde (Git gibi, belirli bir işleme dayalı olarak) depolanan veya dinamik olarak oluşturulan şablonları getirin.
- Özel adlandırma kurallarını uygulama:** Şablonlar için daha kısa takma adlar kullanmak veya belirli bir arama yolu mantığı uygulamak isteyebilirsiniz (örneğin, önce bir tema dizinine bakmak, ardından varsayılan bir dizine geri dönmek).
- Güvenlik veya erişim kontrolü ekleme:** Özel bir yükleyici, belirli şablonları yüklemeden önce kullanıcı izinlerini doğrulayabilir.
- Ön işleme:** Genel olarak tavsiye edilmese de(derleyici geçişleri
daha iyidir), bir yükleyici şablon içeriğini Latte'ye vermeden önce teorik olarak ön işleme tabi tutabilir.
Latte\Engine
örneğiniz için yükleyiciyisetLoader()
yöntemini kullanarak yapılandırırsınız:
$latte = new Latte\Engine;
// '/path/to/templates' içindeki dosyalar için varsayılan FileLoader'ı kullanın
$loader = new Latte\Loaders\FileLoader('/path/to/templates');
$latte->setLoader($loader);
Bir yükleyici Latte\Loader
arayüzünü uygulamalıdır.
Yerleşik Yükleyiciler
Latte birkaç standart yükleyici sağlar:
FileLoader
Bu, başka bir yükleyici belirtilmemişse Latte\Engine
tarafından kullanılan varsayılan yükleyicidir.
Şablonları doğrudan dosya sisteminden yükler.
İsteğe bağlı olarak erişimi kısıtlamak için bir kök dizin ayarlayabilirsiniz:
use Latte\Loaders\FileLoader;
// Aşağıdakiler yalnızca /var/www/html/templates içindeki şablonların yüklenmesine izin verecektir
$loader = new FileLoader('/var/www/html/templates');
$latte->setLoader($loader);
// $latte->render('../../../etc/passwd'); // Bu bir istisna oluşturur
// Render template located at /var/www/html/templates/pages/contact.latte
$latte->render('pages/contact.latte');
Mutlak bir yol verilmediği sürece, {include}
veya {layout}
gibi etiketler kullanıldığında
şablon adlarını geçerli şablona göre çözümler.
StringLoader
Bu yükleyici, şablon içeriğini, anahtarların şablon adları (tanımlayıcılar) ve değerlerin şablon kaynak kodu dizeleri olduğu bir ilişkisel diziden alır. Şablonların PHP kodu içinde saklanabileceği testler veya küçük uygulamalar için özellikle kullanışlıdır.
use Latte\Loaders\StringLoader;
$loader = new StringLoader([
'main.latte' => 'Hello {$name}, include is below:{include helper.latte}',
'helper.latte' => '{var $x = 10}Included content: {$x}',
// Gerektiğinde daha fazla şablon ekleyin
]);
$latte->setLoader($loader);
$latte->render('main.latte', ['name' => 'World']);
// Çıktılar: Merhaba Dünya, include aşağıdaki gibidir: Included content: 10
Diğer adlandırılmış dize şablonlarına başvuran içerme veya kalıtıma ihtiyaç duymadan doğrudan bir dizeden
yalnızca tek bir şablon oluşturmanız gerekiyorsa, StringLoader
adresini dizi olmadan kullanırken dizeyi
doğrudan render()
veya renderToString()
adresine aktarabilirsiniz:
$loader = new StringLoader;
$latte->setLoader($loader);
$templateString = 'Hello {$name}!';
$output = $latte->renderToString($templateString, ['name' => 'Alice']);
// $çıktı 'Merhaba Alice!' içeriyor
Özel Yükleyici Oluşturma
Kendi yükleyicinizi oluşturmak için (örneğin, şablonları bir veritabanından, önbellekten, sürüm kontrolünden veya başka bir kaynaktan yüklemek için), Latte\Loader arayüzünü uygulayan bir sınıf oluşturmanız gerekir.
Şimdi her bir yöntemin ne yapması gerektiğine bakalım.
getContent (string $name): string
Bu, yükleyicinin temel yöntemidir. Sorumluluğu, $name
tarafından tanımlanan şablon için tam kaynak kodu
içeriğini almak ve döndürmektir ( $latte->render()
'a aktarıldığı veya getReferredName() tarafından döndürüldüğü gibi).
Şablon bulunamaz veya şablona erişilemezse, bu yöntem bir Latte\RuntimeException
atmalıdır.
public function getContent(string $name): string
{
// Örnek: Varsayımsal bir dahili depolama alanından getirme
$content = $this->storage->read($name);
if ($content === null) {
throw new Latte\RuntimeException("Template '$name' cannot be loaded.");
}
return $content;
}
getReferredName (string $name, string $referringName): string
Bu yöntem, {include}
, {layout}
gibi etiketler içinde kullanılan şablon adlarının
çözümlenmesiyle ilgilenir. Latte, örneğin main.latte
içinde {include 'partial.latte'}
ile
karşılaştığında, bu yöntemi $name = 'partial.latte'
ve $referringName = 'main.latte'
ile
çağırır.
Yöntemin görevi, $name
adresini, $referringName
tarafından sağlanan bağlama dayalı olarak
diğer yükleyici yöntemlerini çağırırken kullanılacak kanonik bir tanımlayıcıya (örneğin, mutlak bir yol, benzersiz
bir veritabanı anahtarı) çözümlemektir.
public function getReferredName(string $name, string $referringName): string
{
return ...;
}
getUniqueId (string $name): string
Latte performans için derlenmiş şablon önbelleğini kullanır. Derlenen her şablon dosyası, kaynak şablonun
tanımlayıcısından türetilen benzersiz bir isme ihtiyaç duyar. Bu yöntem, $name
şablonunu özel olarak
tanımlayan bir dize sağlar.
Dosya tabanlı şablonlar için mutlak yol işe yarayabilir. Veritabanı şablonları için, bir önek ve veritabanı kimliğinin bir kombinasyonu yaygındır.
public function getUniqueId(string $name): string
{
return ...;
}
Örnek: Basit Veritabanı Yükleyici
Bu örnek, name
(benzersiz tanımlayıcı), content
ve updated_at
sütunlarıyla
templates
adlı bir veritabanı tablosunda depolanan şablonları alan bir yükleyicinin temel yapısını
göstermektedir.
use Latte;
class DatabaseLoader implements Latte\Loader
{
public function __construct(
private \PDO $db,
) {
}
public function getContent(string $name): string
{
$stmt = $this->db->prepare('SELECT content FROM templates WHERE name = ?');
$stmt->execute([$name]);
$content = $stmt->fetchColumn();
if ($content === false) {
throw new Latte\RuntimeException("Template '$name' not found in database.");
}
return $content;
}
// Bu basit örnek, şablon adlarının ('ana sayfa', 'makale', vb.)
// benzersiz kimliklerdir ve şablonlar birbirlerine göreceli olarak referans vermezler.
public function getReferredName(string $name, string $referringName): string
{
return $name;
}
public function getUniqueId(string $name): string
{
// Burada bir önek ve ismin kendisini kullanmak benzersizdir ve yeterlidir
return 'db_' . $name;
}
}
// Kullanım şekli:
$pdo = new \PDO(/* connection details */);
$loader = new DatabaseLoader($pdo);
$latte->setLoader($loader);
$latte->render('homepage'); // DB'den 'anasayfa' adlı şablonu yükler
Özel yükleyiciler, Latte şablonlarınızın nereden geldiği üzerinde tam kontrol sahibi olmanızı sağlayarak çeşitli depolama sistemleri ve iş akışlarıyla entegrasyona olanak tanır.