RobotLoader: Sınıf Otomatik Yükleme
RobotLoader, üçüncü taraf kütüphaneleri de dahil olmak üzere tüm uygulamanız için otomatik sınıf yükleme rahatlığı sağlayan bir araçtır.
- Tüm
require
ifadelerini ortadan kaldırın - Yalnızca gerekli komut dosyaları yüklenecektir
- Dizinler veya dosyalar için katı adlandırma kuralları gerektirmez
- Son derece hızlı
- Manuel önbellek güncellemesi yok, her şey otomatik olarak çalışıyor
- Olgun, istikrarlı ve yaygın olarak kullanılan kütüphane
Böylece, bu tanıdık kod bloklarını unutabiliriz:
require_once 'Utils/Page.php';
require_once 'Utils/Style.php';
require_once 'Utils/Paginator.php';
//...
Kurulum
RobotLoader'ı, komut dosyanıza require
kullanarak eklediğiniz tek bir bağımsız dosya
RobotLoader.php
olarak indirebilir ve anında tüm uygulama için rahat otomatik yüklemenin keyfini
çıkarabilirsiniz.
require '/path/to/RobotLoader.php';
$loader = new Nette\Loaders\RobotLoader;
//...
Composer kullanarak bir uygulama oluşturuyorsanız, bunu şu yolla yükleyebilirsiniz:
composer require nette/robot-loader
Kullanım
Google robotunun web sayfalarını tarayıp indekslemesine benzer şekilde, RobotLoader tüm PHP betiklerini gözden geçirir ve hangi sınıfları, arayüzleri, özellikleri ve enumları bulduğunu not eder. Daha sonra sonuçları sonraki isteklerde kullanmak üzere önbellekte saklar. Sadece hangi dizinlerden geçmesi gerektiğini ve önbelleğin nerede saklanacağını belirtmeniz gerekir:
$loader = new Nette\Loaders\RobotLoader;
// RobotLoader'ın dizine ekleyeceği dizinler (alt dizinler dahil)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');
// Önbelleğe almayı 'temp' dizinine ayarlayın
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // RobotLoader'ı Etkinleştir
İşte bu kadar, bu noktadan sonra require
adresini kullanmamıza gerek yok. Harika!
RobotLoader, indeksleme sırasında yinelenen bir sınıf adıyla karşılaşırsa, bir istisna atacak ve sizi bilgilendirecektir. RobotLoader ayrıca bilinmeyen bir sınıfı yüklemesi gerektiğinde önbelleği otomatik olarak günceller. Üretim sunucularında bunu kapatmanızı öneririz, bkz.
RobotLoader'ın belirli dizinleri atlamasını istiyorsanız, $loader->excludeDirectory('temp')
adresini
kullanın (birden çok kez çağrılabilir veya birden çok dizin geçebilir).
Varsayılan olarak, RobotLoader PHP dosyalarındaki hataları bir ParseError
istisnası atarak bildirir. Bu,
$loader->reportParseErrors(false)
kullanılarak bastırılabilir.
Nette Uygulama
$configurator
adresinin Bootstrap.php
adresinde kullanıldığı Nette Uygulaması içinde
RobotLoader'ı bu şekilde kurabilirsiniz:
$configurator = new Nette\Bootstrap\Configurator;
//...
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
->addDirectory(__DIR__)
->addDirectory(__DIR__ . '/../libs')
->register();
PHP Dosya Çözümleyicisi
RobotLoader, otomatik yükleme işlevini kullanmadan ** PHP dosyalarındaki sınıfları, arayüzleri, özellikleri ve enumları bulmak için de kullanılabilir:
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
// Sınıflar/arayüzler/özellikler/enumlar için dizinleri tarar
$loader->rebuild();
// Sınıf => dosya adı çiftlerinden oluşan bir dizi döndürür
$res = $loader->getIndexedClasses();
Böyle bir kullanımda bile önbelleğe alma özelliğinden yararlanabilirsiniz. Bu, değişmeyen dosyaların yeniden taranmamasını sağlar:
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
// Önbelleğe almayı 'temp' dizinine ayarlayın
$loader->setTempDirectory(__DIR__ . '/temp');
// Önbellek kullanarak dizinleri tarar
$loader->refresh();
// Sınıf => dosya adı çiftlerinden oluşan bir dizi döndürür
$res = $loader->getIndexedClasses();
Önbellekleme
RobotLoader çok hızlıdır çünkü akıllıca önbellekleme kullanır.
Geliştirme sırasında, arka planda çalıştığını neredeyse hiç fark etmezsiniz. Sınıfların ve dosyaların oluşturulabileceğini, silinebileceğini, yeniden adlandırılabileceğini vb. göz önünde bulundurarak önbelleğini sürekli olarak günceller. Ve değişmemiş dosyaları yeniden taramaz.
Öte yandan, bir üretim sunucusunda, dosyalar değişmediği için $loader->setAutoRefresh(false)
adresini
kullanarak önbellek güncellemelerini kapatmanızı öneririz (bir Nette Uygulamasında bu otomatik olarak gerçekleşir). Aynı
zamanda, barındırmaya yeni bir sürüm yüklerken önbelleği temizlemek gerekir.
Önbellek henüz mevcut olmadığında ilk dosya taraması, daha büyük uygulamalar için doğal olarak biraz zaman alabilir. RobotLoader, önbellek izdihamına karşı yerleşik bir önleme sahiptir. Bu, bir üretim sunucusunda çok sayıda eşzamanlı isteğin RobotLoader'ı tetikleyeceği bir durumdur ve önbellek henüz mevcut olmadığından, hepsi sunucuyu aşırı yükleyecek dosyaları taramaya başlayacaktır. Neyse ki, RobotLoader sadece ilk iş parçacığı dosyaları indeksleyecek, önbelleği oluşturacak ve geri kalanı bekleyecek ve sonra önbelleği kullanacak şekilde çalışır.
PSR-4
Günümüzde, PSR-4'e bağlı kalarak Composer'ı
otomatik yükleme için kullanabilirsiniz. Basitçe söylemek gerekirse, ad alanlarının ve sınıf adlarının dizin
yapısına ve dosya adlarına karşılık geldiği bir sistemdir, örneğin, App\Core\RouterFactory
/path/to/App/Core/RouterFactory.php
dosyasında olacaktır.
RobotLoader herhangi bir sabit yapıya bağlı değildir, bu nedenle dizin yapısının tam olarak PHP ad alanları gibi tasarlanmasını istemediğiniz durumlarda veya tarihsel olarak bu tür kuralları kullanmayan bir uygulama geliştirirken kullanışlıdır. Her iki yükleyiciyi birlikte kullanmak da mümkündür.