RobotLoader: Sınıf Otomatik Yükleme
RobotLoader, üçüncü taraf kütüphaneler dahil tüm uygulamanız için sınıfların otomatik olarak yüklenmesi rahatlığını sağlayan bir araçtır.
- tüm
require
'lardan kurtulacağız - yalnızca gerekli betikler yüklenecek
- dizinlerin veya dosyaların katı adlandırma kuralları gerektirmez
- son derece hızlı
- manuel önbellek güncellemesi yok, her şey otomatik olarak gerçekleşir
- olgun, kararlı ve yaygın olarak kullanılan bir kütüphane
Bu nedenle, bu bilinen kod bloklarını unutabiliriz:
require_once 'Utils/Page.php';
require_once 'Utils/Style.php';
require_once 'Utils/Paginator.php';
// ...
Kurulum
RobotLoader'ı RobotLoader.php
olarak tek bir bağımsız dosya olarak indirebilir, betiğinize require
ile ekleyebilir ve hemen tüm uygulama için
rahat otomatik yüklemeye sahip olabilirsiniz.
require '/path/to/RobotLoader.php';
$loader = new Nette\Loaders\RobotLoader;
// ...
Composer kullanan bir uygulama oluşturuyorsanız, onu kullanarak yükleyebilirsiniz:
composer require nette/robot-loader
Kullanım
Google robotunun web sayfalarını tarayıp indekslemesi gibi, RobotLoader da tüm PHP betiklerini tarar ve içlerinde hangi sınıfları, arayüzleri, trait'leri ve enumları bulduğunu kaydeder. Araştırmasının sonuçlarını daha sonra önbelleğe kaydeder ve bir sonraki istekte kullanır. Bu nedenle, hangi dizinleri tarayacağını ve önbelleği nereye kaydedeceğini belirtmek yeterlidir:
$loader = new Nette\Loaders\RobotLoader;
// RobotLoader'ın indeksleyeceği dizinler (alt dizinler dahil)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');
// önbelleklemeyi 'temp' dizinine ayarlayın
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // RobotLoader'ı başlatın
Ve hepsi bu, bu andan itibaren require
kullanmamıza gerek yok. Harika!
RobotLoader indeksleme sırasında yinelenen bir sınıf adıyla karşılaşırsa, bir istisna fırlatır ve sizi bilgilendirir. RobotLoader ayrıca bilmediği bir sınıfı yüklemesi gerektiğinde önbelleği otomatik olarak günceller. Bunu üretim sunucularında kapatmanızı öneririz, bkz. #Önbellekleme.
RobotLoader'ın bazı dizinleri atlamasını istiyorsanız, $loader->excludeDirectory('temp')
kullanın (birden
çok kez çağrılabilir veya birden çok dizin iletilebilir).
Varsayılan olarak, RobotLoader PHP dosyalarındaki hataları ParseError
istisnası fırlatarak bildirir. Bu,
$loader->reportParseErrors(false)
kullanılarak bastırılabilir.
Nette uygulaması
Başlatıcı dosya Bootstrap.php
içinde $configurator
nesnesinin kullanıldığı Nette
uygulamasında, yazım basitleştirilebilir:
$configurator = new Nette\Bootstrap\Configurator;
// ...
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
->addDirectory(__DIR__)
->addDirectory(__DIR__ . '/../libs')
->register();
PHP Dosya Ayrıştırıcısı
RobotLoader ayrıca PHP dosyalarında sınıfları, arayüzleri, trait'leri ve enumları bulmak için otomatik yükleme işlevini kullanmadan saf olarak da kullanılabilir:
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
// sınıflar / arayüzler / trait'ler / enumlar için dizinleri tara
$loader->rebuild();
// sınıf => dosya adı çiftleri dizisi döndürür
$res = $loader->getIndexedClasses();
Böyle bir kullanımda bile önbelleği kullanabilirsiniz. Bu sayede, yeniden tarama sırasında değiştirilmemiş dosyalar tekrar tekrar analiz edilmeyecektir:
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
// önbelleklemeyi 'temp' dizinine ayarlayın
$loader->setTempDirectory(__DIR__ . '/temp');
// önbelleği kullanarak dizinleri tara
$loader->refresh();
// sınıf => dosya adı çiftleri dizisi döndürür
$res = $loader->getIndexedClasses();
Önbellekleme
RobotLoader çok hızlıdır çünkü önbelleği akıllıca kullanır.
Geliştirme sırasında, pratikte arka planda çalıştığını fark etmezsiniz. Sınıfların ve dosyaların oluşturulabileceği, yok olabileceği, yeniden adlandırılabileceği vb. beklentisiyle önbelleği sürekli olarak günceller. Ve değişmemiş dosyaları tekrar tekrar taramaz.
Üretim sunucusuna dağıtım yaparken ise, dosyalar değişmediği için önbellek güncellemesini
$loader->setAutoRefresh(false)
kullanarak kapatmanızı öneririz (Nette Uygulamasında bu otomatik olarak
yapılır). Aynı zamanda, barındırmaya yeni bir sürüm yüklerken önbelleği silmek gerekir.
Önbellek henüz mevcut olmadığında dosyaların ilk taranması, daha büyük uygulamalar için doğal olarak biraz zaman alabilir. RobotLoader, cache stampede karşı yerleşik bir önleme sahiptir. Bu, üretim sunucusunda RobotLoader'ı başlatan daha fazla sayıda eşzamanlı isteğin bir araya geldiği ve önbellek henüz mevcut olmadığı için hepsinin dosyaları taramaya başlayacağı bir durumdur. Bu, sunucuyu aşırı derecede yüklerdi. Neyse ki, RobotLoader öyle çalışır ki, birden fazla eşzamanlı istek olduğunda, dosyaları yalnızca ilk iş parçacığı indeksler, önbelleği oluşturur, diğerleri bekler ve ardından önbelleği kullanır.
PSR-4
Bugün, PSR-4'e uyarken otomatik yükleme için
Composer kullanılabilir. Basitçe söylemek gerekirse, bu, 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, yani ö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 PHP'deki ad alanlarıyla aynı şekilde tasarlanmış bir dizin yapısına sahip olmanın tam olarak uygun olmadığı 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.