Nette RobotLoader

RobotLoader, üçüncü taraf kütüphaneler dahil uygulamanızın tamamı için otomatik sınıf yükleme rahatlığı sunan bir araçtır.

  • Tüm require deyimlerini ortadan kaldırır
  • Yalnızca gereken betikler yüklenir
  • Dizinler ya da dosyalar için katı adlandırma kuralları gerektirmez
  • Olağanüstü hızlıdır
  • Elle önbellek güncellemesi yok; her şey otomatik olur
  • Olgun, kararlı ve yaygın kullanılan bir 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'ı tek bir bağımsız RobotLoader.php dosyası olarak indirebilir, onu betiğinizde require ile ekleyebilir ve uygulamanın tamamı için rahat autoloading'in tadını hemen çıkarabilirsiniz.

require '/path/to/RobotLoader.php';

$loader = new Nette\Loaders\RobotLoader;
// ...

Uygulamanızı Composer kullanarak kuruyorsanız, onu şöyle kurabilirsiniz:

composer require nette/robot-loader

Kullanım

Google robotunun web sayfalarını tarayıp indekslemesine benzer biçimde, RobotLoader tüm PHP betiklerini dolaşır ve hangi sınıfları, arayüzleri, trait'leri ve enum'ları bulduğunu kaydeder. Sonra bu bulguları bir önbellekte saklar ve onları sonraki istekler için kullanır. Yalnızca hangi dizinleri taraması gerektiğini ve önbelleği nerede saklayacağını belirtmeniz yeter:

$loader = new Nette\Loaders\RobotLoader;

// RobotLoader'ın indeksleyeceği dizinler (alt dizinler dahil)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');

// Önbelleklemeyi 'temp' dizinine ayarla
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // RobotLoader'ı etkinleştir

Ve hepsi bu! Bu noktadan sonra require kullanmanı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 günceller. Üretim sunucularında bunu kapatmanızı öneririz, bkz. Önbellekleme.

RobotLoader'ın belirli dizinleri atlamasını isterseniz $loader->excludeDirectory('temp') kullanın (birden çok kez çağrılabilir ya da birden çok dizin aktarılabilir).

RobotLoader varsayılan olarak yalnızca .php uzantılı dosyaları tarar. Başka dosya tiplerini de indekslemek için, maskelerden oluşan bir dizi tutan $acceptFiles özelliğini ayarlayın:

$loader->acceptFiles = ['*.php', '*.inc'];

$ignoreDirs özelliği de benzer biçimde, tarama sırasında her zaman atlanan dizinlerin maskelerini tutar (varsayılan .*, *.old, *.bak, *.tmp, temp).

RobotLoader varsayılan olarak PHP dosyalarındaki hataları bir ParseError istisnası fırlatarak bildirir. Bu, $loader->reportParseErrors(false) kullanılarak bastırılabilir.

Kaputun altında register(), tryLoad() metodunu PHP'nin autoloading zincirine bağlar. PHP bilinmeyen bir sınıfa, arayüze, trait'e ya da enum'a gereksinim duyduğunda, adı $loader->tryLoad($type) metoduna aktarır; o da eşleşen dosyayı bulur ve onu ekler.

Nette Application

Bootstrap.php açılış dosyasında $configurator nesnesinin kullanıldığı bir Nette Application içinde kurulum basitleştirilebilir:

$configurator = new Nette\Bootstrap\Configurator;
// ...
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
	->addDirectory(__DIR__)
	->addDirectory(__DIR__ . '/../libs')
	->register();

PHP Dosyaları Çözümleyicisi

RobotLoader, autoloading işlevini kullanmadan, salt PHP dosyalarındaki sınıfları, arayüzleri, trait'leri ve enum'ları bulmak için de kullanılabilir:

$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');

// Dizinleri sınıflar/arayüzler/trait'ler/enum'lar için tarar
$loader->rebuild();

// class => dosya adı çiftlerinden oluşan bir dizi döndürür
$res = $loader->getIndexedClasses();

Böyle bir kullanımda bile önbellekten yararlanabilirsiniz. Bu, değişmemiş dosyaların yeniden taranmamasını sağlar:

$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');

// Önbelleklemeyi 'temp' dizinine ayarla
$loader->setTempDirectory(__DIR__ . '/temp');

// Dizinleri önbelleği kullanarak tarar
$loader->refresh();

// class => dosya adı çiftlerinden oluşan bir dizi döndürür
$res = $loader->getIndexedClasses();

Önbellekleme

RobotLoader, önbelleği akıllıca kullandığı için çok hızlıdır.

Geliştirme sırasında onun arka planda çalıştığını neredeyse fark etmezsiniz. Sınıfların ve dosyaların oluşturulabileceğini, silinebileceğini, yeniden adlandırılabileceğini vb. öngörerek önbelleğini sürekli günceller. Ve değişmemiş dosyaları yeniden taramaz.

Üretim sunucusunda ise, dosyalar değişmediğinden, $loader->setAutoRefresh(false) kullanarak önbellek güncellemelerini kapatmanızı öneririz (bu, bir Nette Application'da otomatik olur). Aynı zamanda, hosting ortamına yeni bir sürüm yüklerken önbelleği temizlemek gerekir.

Önbellek henüz yokken dosyaların ilk taranması, daha büyük uygulamalarda doğal olarak biraz sürebilir. RobotLoader'ın cache stampede durumuna karşı yerleşik bir önlemi vardır. Bu, üretim sunucusundaki çok sayıda eşzamanlı isteğin RobotLoader'ı tetiklediği ve önbellek henüz olmadığından hepsinin dosyaları taramaya başlayarak sunucuyu aşırı yükleyebileceği durumdur. Neyse ki RobotLoader öyle çalışır ki, birden çok eşzamanlı istekte yalnızca ilk iş parçacığı dosyaları indeksler ve önbelleği oluşturur, diğerleri ise bekleyip sonra üretilen önbelleği kullanır.

PSR-4

Bugünlerde PSR-4'e uyarak autoloading için Composer'ı kullanabilirsiniz. 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; örneğin App\Core\RouterFactory sınıfı /path/to/App/Core/RouterFactory.php dosyasında olacaktır.

RobotLoader herhangi bir sabit yapıya bağlı değildir, dolayısıyla dizin yapısının PHP ad alanlarıyla tam olarak eşleşmesini istemediğiniz durumlarda ya da tarihsel olarak böyle kurallar kullanmayan bir uygulama geliştirirken yararlıdır. İki yükleyiciyi birlikte kullanmak da mümkündür.

Daha yeni bir sürüme yükseltiyorsanız yükseltme sayfasına bakın.

versiyon: 4.x