Nette Documentation Preview

syntax
RobotLoader: Sınıf Otomatik Yükleme
***********************************

<div class=perex>

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.

- Tüm `require` ifadelerini ortadan kaldırın
- Yalnızca gerekli komut dosyaları yüklenecektir
- Dizinler veya dosyalar için katı adlandırma kuralları gerektirmez
- Son derece hızlı
- Manuel önbellek güncellemesi yok, her şey otomatik olarak çalışıyor
- Olgun, istikrarlı ve yaygın olarak kullanılan kütüphane

</div>

Böylece, bu tanıdık kod bloklarını unutabiliriz:

```php
require_once 'Utils/Page.php';
require_once 'Utils/Style.php';
require_once 'Utils/Paginator.php';
//...
```


Kurulum .[#toc-installation]
----------------------------

RobotLoader'ı, komut dosyanıza `require` kullanarak eklediğiniz tek bir [bağımsız dosya `RobotLoader.php` |https://github.com/nette/robot-loader/raw/standalone/src/RobotLoader/RobotLoader.php] olarak indirebilir ve anında tüm uygulama için rahat otomatik yüklemenin keyfini çıkarabilirsiniz.

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

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

 [Composer |best-practices:composer] kullanarak bir uygulama oluşturuyorsanız, bunu şu yolla yükleyebilirsiniz:

```shell
composer require nette/robot-loader
```


Kullanım .[#toc-usage]
----------------------

Google robotunun web sayfalarını tarayıp indekslemesine benzer şekilde, [RobotLoader |api:Nette\Loaders\RobotLoader] tüm PHP betiklerini gözden geçirir ve hangi sınıfları, arayüzleri, özellikleri ve enumları bulduğunu not eder. Daha sonra sonuçları sonraki isteklerde kullanmak üzere önbellekte saklar. Sadece hangi dizinlerden geçmesi gerektiğini ve önbelleğin nerede saklanacağını belirtmeniz gerekir:

```php
$loader = new Nette\Loaders\RobotLoader;

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

// Önbelleğe almayı 'temp' dizinine ayarlayın
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // RobotLoader'ı Etkinleştir
```

İşte bu kadar, bu noktadan sonra `require` adresini kullanmamıza gerek yok. Harika!

RobotLoader, indeksleme sırasında yinelenen bir sınıf adıyla karşılaşırsa, bir istisna atacak ve sizi bilgilendirecektir. RobotLoader ayrıca bilinmeyen bir sınıfı yüklemesi gerektiğinde önbelleği otomatik olarak günceller. Üretim sunucularında bunu [kapatmanızı |#Caching] öneririz, bkz.

RobotLoader'ın belirli dizinleri atlamasını istiyorsanız, `$loader->excludeDirectory('temp')` adresini kullanın (birden çok kez çağrılabilir veya birden çok dizin geçebilir).

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


Nette Uygulama .[#toc-nette-application]
----------------------------------------

 `$configurator` adresinin `Bootstrap.php` adresinde kullanıldığı Nette Uygulaması içinde RobotLoader'ı bu şekilde kurabilirsiniz:

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


PHP Dosya Çözümleyicisi .[#toc-php-files-analyzer]
--------------------------------------------------

RobotLoader, otomatik yükleme işlevini kullanmadan ** PHP dosyalarındaki sınıfları, arayüzleri, özellikleri ve enumları bulmak için de kullanılabilir:

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

// Sınıflar/arayüzler/özellikler/enumlar 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ğe alma özelliğinden yararlanabilirsiniz. Bu, değişmeyen dosyaların yeniden taranmamasını sağlar:

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

// Önbelleğe almayı 'temp' dizinine ayarlayın
$loader->setTempDirectory(__DIR__ . '/temp');

// Önbellek kullanarak dizinleri tarar
$loader->refresh();

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


Önbellekleme .[#toc-caching]
----------------------------

RobotLoader çok hızlıdır çünkü akıllıca önbellekleme kullanır.

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

Öte yandan, bir üretim sunucusunda, dosyalar değişmediği için `$loader->setAutoRefresh(false)` adresini kullanarak önbellek güncellemelerini kapatmanızı öneririz (bir Nette Uygulamasında bu otomatik olarak gerçekleşir). Aynı zamanda, barındırmaya yeni bir sürüm yüklerken **önbelleği temizlemek** gerekir.

Önbellek henüz mevcut olmadığında ilk dosya taraması, daha büyük uygulamalar için doğal olarak biraz zaman alabilir. RobotLoader, "önbellek izdihamına":https://en.wikipedia.org/wiki/Cache_stampede karşı yerleşik bir önleme sahiptir.
Bu, bir üretim sunucusunda çok sayıda eşzamanlı isteğin RobotLoader'ı tetikleyeceği bir durumdur ve önbellek henüz mevcut olmadığından, hepsi sunucuyu aşırı yükleyecek dosyaları taramaya başlayacaktır.
Neyse ki, RobotLoader sadece ilk iş parçacığı dosyaları indeksleyecek, önbelleği oluşturacak ve geri kalanı bekleyecek ve sonra önbelleği kullanacak şekilde çalışır.


PSR-4 .[#toc-psr-4]
-------------------

Günümüzde, PSR-4'e bağlı kalarak [Composer'ı otomatik yükleme için |best-practices:composer#autoloading] kullanabilirsiniz. Basitçe söylemek gerekirse, 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` `/path/to/App/Core/RouterFactory.php` dosyasında olacaktır.

RobotLoader herhangi bir sabit yapıya bağlı değildir, bu nedenle dizin yapısının tam olarak PHP ad alanları gibi tasarlanmasını istemediğiniz durumlarda 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.


{{leftbar: nette:@menu-topics}}

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.

  • Tüm require ifadelerini ortadan kaldırın
  • Yalnızca gerekli komut dosyaları yüklenecektir
  • Dizinler veya dosyalar için katı adlandırma kuralları gerektirmez
  • Son derece hızlı
  • Manuel önbellek güncellemesi yok, her şey otomatik olarak çalışıyor
  • Olgun, istikrarlı ve yaygın olarak kullanılan 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'ı, komut dosyanıza require kullanarak eklediğiniz tek bir bağımsız dosya RobotLoader.php olarak indirebilir ve anında tüm uygulama için rahat otomatik yüklemenin keyfini çıkarabilirsiniz.

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

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

Composer kullanarak bir uygulama oluşturuyorsanız, bunu şu yolla yükleyebilirsiniz:

composer require nette/robot-loader

Kullanım

Google robotunun web sayfalarını tarayıp indekslemesine benzer şekilde, RobotLoader tüm PHP betiklerini gözden geçirir ve hangi sınıfları, arayüzleri, özellikleri ve enumları bulduğunu not eder. Daha sonra sonuçları sonraki isteklerde kullanmak üzere önbellekte saklar. Sadece hangi dizinlerden geçmesi gerektiğini ve önbelleğin nerede saklanacağını belirtmeniz gerekir:

$loader = new Nette\Loaders\RobotLoader;

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

// Önbelleğe almayı 'temp' dizinine ayarlayın
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // RobotLoader'ı Etkinleştir

İşte bu kadar, bu noktadan sonra require adresini kullanmamıza gerek yok. Harika!

RobotLoader, indeksleme sırasında yinelenen bir sınıf adıyla karşılaşırsa, bir istisna atacak ve sizi bilgilendirecektir. RobotLoader ayrıca bilinmeyen bir sınıfı yüklemesi gerektiğinde önbelleği otomatik olarak günceller. Üretim sunucularında bunu kapatmanızı öneririz, bkz.

RobotLoader'ın belirli dizinleri atlamasını istiyorsanız, $loader->excludeDirectory('temp') adresini kullanın (birden çok kez çağrılabilir veya birden çok dizin geçebilir).

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

Nette Uygulama

$configurator adresinin Bootstrap.php adresinde kullanıldığı Nette Uygulaması içinde 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 işlevini kullanmadan ** PHP dosyalarındaki sınıfları, arayüzleri, özellikleri ve enumları bulmak için de kullanılabilir:

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

// Sınıflar/arayüzler/özellikler/enumlar 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ğe alma özelliğinden yararlanabilirsiniz. Bu, değişmeyen dosyaların yeniden taranmamasını sağlar:

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

// Önbelleğe almayı 'temp' dizinine ayarlayın
$loader->setTempDirectory(__DIR__ . '/temp');

// Ö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ü akıllıca önbellekleme kullanır.

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

Öte yandan, bir üretim sunucusunda, dosyalar değişmediği için $loader->setAutoRefresh(false) adresini kullanarak önbellek güncellemelerini kapatmanızı öneririz (bir Nette Uygulamasında bu otomatik olarak gerçekleşir). Aynı zamanda, barındırmaya yeni bir sürüm yüklerken önbelleği temizlemek gerekir.

Önbellek henüz mevcut olmadığında ilk dosya taraması, daha büyük uygulamalar için doğal olarak biraz zaman alabilir. RobotLoader, önbellek izdihamına karşı yerleşik bir önleme sahiptir. Bu, bir üretim sunucusunda çok sayıda eşzamanlı isteğin RobotLoader'ı tetikleyeceği bir durumdur ve önbellek henüz mevcut olmadığından, hepsi sunucuyu aşırı yükleyecek dosyaları taramaya başlayacaktır. Neyse ki, RobotLoader sadece ilk iş parçacığı dosyaları indeksleyecek, önbelleği oluşturacak ve geri kalanı bekleyecek ve sonra önbelleği kullanacak şekilde çalışır.

PSR-4

Günümüzde, PSR-4'e bağlı kalarak Composer'ı otomatik yükleme için kullanabilirsiniz. Basitçe söylemek gerekirse, 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 /path/to/App/Core/RouterFactory.php dosyasında olacaktır.

RobotLoader herhangi bir sabit yapıya bağlı değildir, bu nedenle dizin yapısının tam olarak PHP ad alanları gibi tasarlanmasını istemediğiniz durumlarda 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.