Nette Documentation Preview

syntax
RobotLoader: Samodejno nalaganje razreda
****************************************

<div class=perex>

RobotLoader je orodje, ki omogoča samodejno nalaganje razredov za celotno aplikacijo, vključno s knjižnicami tretjih oseb.

- Odpravite vse izjave `require`
- Nalagali se bodo samo potrebni skripti
- Ne zahteva strogih poimenovalnih konvencij za imenike ali datoteke
- Izjemno hitro
- Ni ročnih posodobitev predpomnilnika, vse poteka samodejno
- Zrela, stabilna in široko uporabljena knjižnica

</div>

Tako lahko pozabimo na te znane bloke kode:

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


Namestitev .[#toc-installation]
-------------------------------

RobotLoader lahko prenesete kot [eno samostojno datoteko `RobotLoader.php` |https://github.com/nette/robot-loader/raw/standalone/src/RobotLoader/RobotLoader.php], ki jo s pomočjo `require` vključite v svojo skripto, in takoj uživate v udobnem samodejnem nalaganju za celotno aplikacijo.

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

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

Če gradite aplikacijo z uporabo programa [Composer |best-practices:composer], ga lahko namestite prek:

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


Uporaba .[#toc-usage]
---------------------

Podobno kot robot Google preiskuje in indeksira spletne strani, [RobotLoader |api:Nette\Loaders\RobotLoader] pregleda vse skripte PHP in zapiše, katere razrede, vmesnike, lastnosti in enume je našel. Rezultate nato shrani v predpomnilnik za uporabo pri naslednjih zahtevah. Določiti morate le, katere imenike naj pregleda in kje naj shrani predpomnilnik:

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

// imeniki za indeksiranje RobotLoaderja (vključno s podimeniki)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');

// Nastavitev predpomnjenja na imenik 'temp'
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // Aktivirajte RobotLoader
```

In to je to, od te točke naprej nam ni treba več uporabljati `require`. Odlično!

Če RobotLoader med indeksiranjem naleti na podvojeno ime razreda, bo vrgel izjemo in vas o tem obvestil. RobotLoader tudi samodejno posodobi predpomnilnik, kadar mora naložiti neznan razred. Priporočamo, da to izklopite na produkcijskih strežnikih, glejte [Predpomnilnik |#Caching].

Če želite, da RobotLoader preskoči določene imenike, uporabite `$loader->excludeDirectory('temp')` (lahko ga pokličete večkrat ali posredujete več imenikov).

Privzeto RobotLoader poroča o napakah v datotekah PHP tako, da vrže izjemo `ParseError`. To lahko odpravite z uporabo `$loader->reportParseErrors(false)`.


Neto aplikacija .[#toc-nette-application]
-----------------------------------------

Znotraj aplikacije Nette Application, kjer se `$configurator` uporablja v `Bootstrap.php`, lahko RobotLoader nastavite na ta način:

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


Analizator datotek PHP .[#toc-php-files-analyzer]
-------------------------------------------------

RobotLoader lahko uporabite tudi za iskanje razredov, vmesnikov, lastnosti in enumov v datotekah PHP, ne da bi uporabili funkcijo samodejnega nalaganja:

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

// Pregleduje imenike za razrede/interfaces/traits/enums
$loader->rebuild();

// Vrne polje parov razred => ime datoteke
$res = $loader->getIndexedClasses();
```

Tudi pri takšni uporabi lahko uporabite predpomnjenje. To zagotavlja, da se nespremenjene datoteke ne bodo ponovno iskale:

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

// Nastavite predpomnjenje v imenik 'temp'
$loader->setTempDirectory(__DIR__ . '/temp');

// Pregleduje imenike z uporabo predpomnilnika
$loader->refresh();

// Vrne polje parov razred => ime datoteke
$res = $loader->getIndexedClasses();
```


Predpomnilnik .[#toc-caching]
-----------------------------

RobotLoader je zelo hiter, ker pametno uporablja predpomnjenje.

Med razvojem skoraj ne opazite, da teče v ozadju. Svoj predpomnilnik nenehno posodablja, saj upošteva, da se razredi in datoteke lahko ustvarjajo, brišejo, preimenujejo itd. Nespremenjenih datotek ne pregleduje ponovno.

V produkcijskem strežniku pa priporočamo, da posodobitve predpomnilnika izklopite z uporabo spletne strani `$loader->setAutoRefresh(false)` (v aplikaciji Nette se to zgodi samodejno), saj se datoteke ne spreminjajo. Hkrati je treba **izbrisati predpomnilnik** ob prenosu nove različice na gostovanje.

Začetno pregledovanje datotek, ko predpomnilnik še ne obstaja, lahko pri večjih aplikacijah seveda traja nekaj časa. RobotLoader ima vgrajeno preprečevanje "stampeda predpomnilnika":https://en.wikipedia.org/wiki/Cache_stampede.
To je situacija, ko bi veliko število hkratnih zahtevkov v produkcijskem strežniku sprožilo RobotLoader, in ker predpomnilnik še ne obstaja, bi vsi začeli pregledovati datoteke, kar bi preobremenilo strežnik.
Na srečo RobotLoader deluje tako, da samo prva nit indeksira datoteke in ustvari predpomnilnik, ostale pa počakajo in nato uporabijo predpomnilnik.


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

Danes lahko [za samodejno nalaganje uporabljate program Composer |best-practices:composer#autoloading] in hkrati upoštevate PSR-4. Preprosto povedano, gre za sistem, v katerem imenska območja in imena razredov ustrezajo imeniški strukturi in imenom datotek, npr. `App\Core\RouterFactory` bo v datoteki `/path/to/App/Core/RouterFactory.php`.

RobotLoader ni vezan na nobeno fiksno strukturo, zato je uporaben v primerih, ko ne želite, da bi bila struktura imenikov zasnovana povsem enako kot imenski prostori PHP, ali pri razvoju aplikacije, ki v preteklosti ni uporabljala takšnih konvencij. Oba nalagalnika je mogoče uporabljati tudi skupaj.


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

RobotLoader: Samodejno nalaganje razreda

RobotLoader je orodje, ki omogoča samodejno nalaganje razredov za celotno aplikacijo, vključno s knjižnicami tretjih oseb.

  • Odpravite vse izjave require
  • Nalagali se bodo samo potrebni skripti
  • Ne zahteva strogih poimenovalnih konvencij za imenike ali datoteke
  • Izjemno hitro
  • Ni ročnih posodobitev predpomnilnika, vse poteka samodejno
  • Zrela, stabilna in široko uporabljena knjižnica

Tako lahko pozabimo na te znane bloke kode:

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

Namestitev

RobotLoader lahko prenesete kot eno samostojno datoteko RobotLoader.php, ki jo s pomočjo require vključite v svojo skripto, in takoj uživate v udobnem samodejnem nalaganju za celotno aplikacijo.

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

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

Če gradite aplikacijo z uporabo programa Composer, ga lahko namestite prek:

composer require nette/robot-loader

Uporaba

Podobno kot robot Google preiskuje in indeksira spletne strani, RobotLoader pregleda vse skripte PHP in zapiše, katere razrede, vmesnike, lastnosti in enume je našel. Rezultate nato shrani v predpomnilnik za uporabo pri naslednjih zahtevah. Določiti morate le, katere imenike naj pregleda in kje naj shrani predpomnilnik:

$loader = new Nette\Loaders\RobotLoader;

// imeniki za indeksiranje RobotLoaderja (vključno s podimeniki)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');

// Nastavitev predpomnjenja na imenik 'temp'
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // Aktivirajte RobotLoader

In to je to, od te točke naprej nam ni treba več uporabljati require. Odlično!

Če RobotLoader med indeksiranjem naleti na podvojeno ime razreda, bo vrgel izjemo in vas o tem obvestil. RobotLoader tudi samodejno posodobi predpomnilnik, kadar mora naložiti neznan razred. Priporočamo, da to izklopite na produkcijskih strežnikih, glejte Predpomnilnik.

Če želite, da RobotLoader preskoči določene imenike, uporabite $loader->excludeDirectory('temp') (lahko ga pokličete večkrat ali posredujete več imenikov).

Privzeto RobotLoader poroča o napakah v datotekah PHP tako, da vrže izjemo ParseError. To lahko odpravite z uporabo $loader->reportParseErrors(false).

Neto aplikacija

Znotraj aplikacije Nette Application, kjer se $configurator uporablja v Bootstrap.php, lahko RobotLoader nastavite na ta način:

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

Analizator datotek PHP

RobotLoader lahko uporabite tudi za iskanje razredov, vmesnikov, lastnosti in enumov v datotekah PHP, ne da bi uporabili funkcijo samodejnega nalaganja:

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

// Pregleduje imenike za razrede/interfaces/traits/enums
$loader->rebuild();

// Vrne polje parov razred => ime datoteke
$res = $loader->getIndexedClasses();

Tudi pri takšni uporabi lahko uporabite predpomnjenje. To zagotavlja, da se nespremenjene datoteke ne bodo ponovno iskale:

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

// Nastavite predpomnjenje v imenik 'temp'
$loader->setTempDirectory(__DIR__ . '/temp');

// Pregleduje imenike z uporabo predpomnilnika
$loader->refresh();

// Vrne polje parov razred => ime datoteke
$res = $loader->getIndexedClasses();

Predpomnilnik

RobotLoader je zelo hiter, ker pametno uporablja predpomnjenje.

Med razvojem skoraj ne opazite, da teče v ozadju. Svoj predpomnilnik nenehno posodablja, saj upošteva, da se razredi in datoteke lahko ustvarjajo, brišejo, preimenujejo itd. Nespremenjenih datotek ne pregleduje ponovno.

V produkcijskem strežniku pa priporočamo, da posodobitve predpomnilnika izklopite z uporabo spletne strani $loader->setAutoRefresh(false) (v aplikaciji Nette se to zgodi samodejno), saj se datoteke ne spreminjajo. Hkrati je treba izbrisati predpomnilnik ob prenosu nove različice na gostovanje.

Začetno pregledovanje datotek, ko predpomnilnik še ne obstaja, lahko pri večjih aplikacijah seveda traja nekaj časa. RobotLoader ima vgrajeno preprečevanje stampeda predpomnilnika. To je situacija, ko bi veliko število hkratnih zahtevkov v produkcijskem strežniku sprožilo RobotLoader, in ker predpomnilnik še ne obstaja, bi vsi začeli pregledovati datoteke, kar bi preobremenilo strežnik. Na srečo RobotLoader deluje tako, da samo prva nit indeksira datoteke in ustvari predpomnilnik, ostale pa počakajo in nato uporabijo predpomnilnik.

PSR-4

Danes lahko za samodejno nalaganje uporabljate program Composer in hkrati upoštevate PSR-4. Preprosto povedano, gre za sistem, v katerem imenska območja in imena razredov ustrezajo imeniški strukturi in imenom datotek, npr. App\Core\RouterFactory bo v datoteki /path/to/App/Core/RouterFactory.php.

RobotLoader ni vezan na nobeno fiksno strukturo, zato je uporaben v primerih, ko ne želite, da bi bila struktura imenikov zasnovana povsem enako kot imenski prostori PHP, ali pri razvoju aplikacije, ki v preteklosti ni uporabljala takšnih konvencij. Oba nalagalnika je mogoče uporabljati tudi skupaj.