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.

versiyon: 4.0