forked from nette/docs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path@home.texy
129 lines (83 loc) · 6.27 KB
/
@home.texy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
RobotLoader: Încărcarea automată a clasei
*****************************************
<div class=perex>
RobotLoader este un instrument care vă oferă confortul încărcării automate a claselor pentru întreaga dumneavoastră aplicație, inclusiv pentru bibliotecile de la terți.
- scăpați de toate `require`
- sunt încărcate doar scripturile necesare
- nu necesită convenții stricte de denumire a directoarelor sau a fișierelor
</div>
Așadar, putem să uităm de acele celebre blocuri de cod:
```php
require_once 'Utils/Page.php';
require_once 'Utils/Style.php';
require_once 'Utils/Paginator.php';
// ...
```
Instalare .[#toc-installation]
------------------------------
Descărcați și instalați pachetul folosind [Composer |best-practices:composer]:
```shell
composer require nette/robot-loader
```
Utilizare .[#toc-usage]
-----------------------
La fel cum robotul Google răscolește și indexează site-urile web, [RobotLoader |api:Nette\Loaders\RobotLoader] răscolește toate scripturile PHP și înregistrează ce clase și interfețe au fost găsite în ele. Aceste înregistrări sunt apoi salvate în memoria cache și utilizate în timpul tuturor cererilor ulterioare. Trebuie doar să specificați ce directoare să indexați și unde să salvați memoria cache:
```php
$loader = new Nette\Loaders\RobotLoader;
// directoare care urmează să fie indexate de RobotLoader (inclusiv subdirectoarele)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');
// utilizați directorul "temp" pentru memoria cache
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // Rulați RobotLoader
```
Și asta e tot. De acum încolo, nu mai este nevoie să utilizați `require`. Minunat, nu-i așa?
Atunci când RobotLoader întâlnește un nume de clasă duplicat în timpul indexării, acesta aruncă o excepție și vă informează despre aceasta. De asemenea, RobotLoader actualizează automat memoria cache atunci când trebuie să încarce o clasă pe care nu o cunoaște. Vă recomandăm să dezactivați acest lucru pe serverele de producție, consultați [Caching |#Caching].
Dacă doriți ca RobotLoader să sară peste unele directoare, utilizați `$loader->excludeDirectory('temp')` (poate fi apelat de mai multe ori sau puteți trece mai multe directoare).
În mod implicit, RobotLoader raportează erorile din fișierele PHP prin aruncarea excepției `ParseError`. Aceasta poate fi dezactivată prin intermediul `$loader->reportParseErrors(false)`.
Aplicația Nette .[#toc-nette-application]
-----------------------------------------
În cadrul aplicației Nette, unde `$configurator` este utilizat în `Bootstrap.php`, puteți configura RobotLoader în acest mod:
```php
$configurator = new Nette\Bootstrap\Configurator;
// ...
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
->addDirectory(__DIR__)
->addDirectory(__DIR__ . '/../libs')
->register();
```
Analizator de fișiere PHP .[#toc-php-files-analyzer]
----------------------------------------------------
RobotLoader poate fi, de asemenea, utilizat pur și simplu pentru a găsi clase, interfețe și trăsături în fișierele PHP **fără** a utiliza funcția de încărcare automată:
```php
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
// Scanează directoarele pentru clase / interfețe / trăsături
$loader->rebuild();
// Returnează o matrice de perechi clasă => nume de fișier
$res = $loader->getIndexedClasses();
```
Chiar și în cazul unei astfel de utilizări, puteți utiliza memoria cache. Ca urmare, fișierele nemodificate nu vor fi analizate în mod repetat la o nouă scanare:
```php
$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');
$loader->setTempDirectory(__DIR__ . '/temp');
// Scanează directoarele folosind o memorie cache
$loader->refresh();
// Returnează o matrice de perechi clasă => nume de fișier
$res = $loader->getIndexedClasses();
```
Caching .[#toc-caching]
-----------------------
RobotLoader este foarte rapid pentru că utilizează în mod inteligent memoria cache.
Atunci când dezvoltați cu el, practic nu aveți nicio idee că rulează în fundal. Actualizează continuu memoria cache deoarece știe că clasele și fișierele pot fi create, șterse, redenumite etc. Și nu scanează în mod repetat fișierele nemodificate.
Pe de altă parte, atunci când este utilizat pe un server de producție, vă recomandăm să dezactivați actualizarea cache-ului utilizând `$loader->setAutoRefresh(false)` (acest lucru se face automat în aplicația Nette), deoarece fișierele nu se modifică. În același timp, este necesar să **curățați memoria cache** atunci când încărcați o nouă versiune pe hosting.
Desigur, scanarea inițială a fișierelor, atunci când memoria cache nu există deja, poate dura câteva secunde pentru aplicațiile mari. RobotLoader are încorporată o prevenire împotriva "cache stampede":https://en.wikipedia.org/wiki/Cache_stampede.
Aceasta este o situație în care serverul de producție primește un număr mare de cereri concurente și, deoarece memoria cache a RobotLoader nu există încă, toate ar începe să scaneze fișierele. Ceea ce crește brusc utilizarea CPU și a sistemului de fișiere.
Din fericire, RobotLoader funcționează în așa fel încât, pentru mai multe cereri concurente, doar primul fir indexează fișierele, creează o memorie cache, ceilalți așteaptă și apoi folosesc memoria cache.
PSR-4 .[#toc-psr-4]
-------------------
În prezent, Composer poate fi utilizat pentru [încărcarea automată |best-practices:composer#autoloading] în conformitate cu PSR-4. Spunând simplu, este un sistem în care spațiile de nume și numele claselor corespund structurii directoarelor și numelor de fișiere, adică `App\Router\RouterFactory` se află în fișierul `/path/to/App/Router/RouterFactory.php`.
RobotLoader nu este legat de nicio structură fixă, prin urmare, este util în situațiile în care nu vă convine ca structura directoarelor să fie concepută ca spații de nume în PHP sau atunci când dezvoltați o aplicație care, din punct de vedere istoric, nu a folosit astfel de convenții. De asemenea, este posibil să se utilizeze ambele încărcătoare împreună.
{{leftbar: nette:@menu-topics}}