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.
- hepsinden kurtulun
require
- sadece gerekli komut dosyaları yüklenir
- katı dizin veya dosya adlandırma kuralları gerektirmez
Bu yüzden o meşhur kod bloklarını unutabiliriz:
require_once 'Utils/Page.php';
require_once 'Utils/Style.php';
require_once 'Utils/Paginator.php';
// ...
Kurulum
Composer'ı kullanarak paketi indirin ve yükleyin:
composer require nette/robot-loader
Kullanım
Google robotunun web sitelerini taraması ve indekslemesi gibi, RobotLoader da tüm PHP betiklerini tarar ve içlerinde hangi sınıfların ve arayüzlerin bulunduğunu kaydeder. Bu kayıtlar daha sonra önbelleğe kaydedilir ve sonraki tüm istekler sırasında kullanılır. Sadece hangi dizinlerin indeksleneceğini ve önbelleğin nereye kaydedileceğini belirtmeniz gerekir:
$loader = new Nette\Loaders\RobotLoader;
// RobotLoader tarafından indekslenecek dizinler (alt dizinler dahil)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');
// önbellek için 'temp' dizinini kullan
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // RobotLoader'ı çalıştır
Ve hepsi bu kadar. Şu andan itibaren require
adresini kullanmanıza gerek yok. Harika, değil mi?
RobotLoader, indeksleme sırasında yinelenen sınıf adıyla karşılaştığında, bir istisna atar ve sizi bu konuda bilgilendirir. RobotLoader ayrıca bilmediği bir sınıfı yüklemek zorunda kaldığında önbelleği otomatik olarak günceller. Üretim sunucularında bunu devre dışı bırakmanızı öneririz, bkz.
RobotLoader'ın bazı dizinleri atlamasını istiyorsanız, $loader->excludeDirectory('temp')
adresini
kullanın (birden çok kez çağrılabilir veya birden çok dizin geçebilirsiniz).
Varsayılan olarak, RobotLoader PHP dosyalarındaki hataları ParseError
istisnası atarak bildirir.
$loader->reportParseErrors(false)
üzerinden devre dışı bırakılabilir.
Nette Uygulama
Nette uygulaması içinde, $configurator
adresinin kullanıldığı Bootstrap.php
adresinde
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 özelliğini kullanmadan ** PHP dosyalarındaki sınıfları, arayüzleri ve özellikleri bulmak için de kullanılabilir:
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
// Sınıflar / arayüzler / özellikler 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ği kullanabilirsiniz. Sonuç olarak, değiştirilmemiş dosyalar yeniden taranırken tekrar tekrar analiz edilmeyecektir:
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
$loader->setTempDirectory(__DIR__ . '/temp');
// Bir ö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ü önbelleği akıllıca kullanır.
Onunla geliştirme yaparken, arka planda çalıştığına dair neredeyse hiçbir fikriniz olmaz. Sınıfların ve dosyaların oluşturulabileceğini, silinebileceğini, yeniden adlandırılabileceğini vb. bildiği için önbelleği sürekli olarak günceller. Ve değiştirilmemiş dosyaları tekrar tekrar taramaz.
Öte yandan, bir üretim sunucusunda kullanıldığında, dosyalar değişmediği için
$loader->setAutoRefresh(false)
adresini kullanarak önbellek güncellemesini devre dışı bırakmanızı
öneririz (bu, Nette Uygulamasında otomatik olarak yapılır). Aynı zamanda, barındırmaya yeni bir sürüm yüklerken
önbelleği temizlemek gerekir.
Elbette, önbellek zaten mevcut olmadığında dosyaların ilk taranması, daha büyük uygulamalar için birkaç saniye sürebilir. RobotLoader, önbellek izdihamına karşı yerleşik bir önleme sahiptir. Bu, üretim sunucusunun çok sayıda eşzamanlı istek aldığı bir durumdur ve RobotLoader'ın önbelleği henüz mevcut olmadığından, hepsi dosyaları taramaya başlayacaktır. Bu da CPU ve dosya sistemi kullanımını artırır. Neyse ki, RobotLoader, birden fazla eşzamanlı istek için, yalnızca ilk iş parçacığı dosyaları indeksleyecek, bir önbellek oluşturacak, diğerleri bekleyecek ve ardından önbelleği kullanacak şekilde çalışır.
PSR-4
Günümüzde Composer, PSR-4'e uygun olarak otomatik
yükleme için kullanılabilmektedir. Basitçe söylemek gerekirse, isim alanlarının ve sınıf isimlerinin dizin yapısına
ve dosya isimlerine karşılık geldiği bir sistemdir, yani App\Router\RouterFactory
/path/to/App/Router/RouterFactory.php
dosyasında bulunur.
RobotLoader herhangi bir sabit yapıya bağlı değildir, bu nedenle PHP'de ad alanları olarak tasarlanmış dizin yapısına sahip olmanın size uygun olmadığı durumlarda veya tarihsel olarak bu tür sözleşmeleri kullanmayan bir uygulama geliştirirken kullanışlıdır. Her iki yükleyiciyi birlikte kullanmak da mümkündür.