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.

versiyon: 4.0