-
-
Notifications
You must be signed in to change notification settings - Fork 281
/
to-3-0.texy
130 lines (83 loc) · 5.33 KB
/
to-3-0.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
130
Přechod na verzi 3.0
********************
Minimální požadovaná verze PHP je 7.1.
Verzí Nette 3.0 se rozumí, že máte tyto balíčky nainstalované ve verzi 3.0.*:
```json
"require": {
"nette/application": "3.0.*",
"nette/bootstrap": "3.0.*",
"nette/di": "3.0.*",
"nette/forms": "3.0.*",
"nette/http": "3.0.*",
"nette/security": "3.0.*",
},
```
Pozor: u ostatních balíčků nainstalujte nejnovější verzi, kterou vám dovolí Composer! Mohou mít totiž jiné verzování. Zkuste uvést `"*"` a podívejte se, jakou verzi Composer nainstaluje.
PHP 7.1 type hints
------------------
Nette 3.0 používá typehinty pro parametry a návratové hodnoty metod. Pokud dědíte od třídy z Nette a přepisujete některou z metod, u kterých jsou nyní typehinty, vyhodí PHP chybu podobnou této:
```
Fatal error: Declaration of Nette\Application\UI\Component::attached($presenter) must be compatible with
Nette\ComponentModel\Component::attached(Nette\ComponentModel\IComponent $obj): void
```
Je potřeba stejné typehinty doplnit i do přepisované metody. K automatickému doplnění chybějících typehintů můžete použít nástroj "Nette TypeFixer":https://github.com/nette/type-fixer. Jednoduše ho zavoláte v projektu (tedy adresáři v němž jsou složky `/vendor` a `/app`):
```shell
typefixer --fix my-project-dir
```
Samozřejmě předtím vše raději zazálohujte.
Formuláře
---------
Všechny prvky formuláře jsou nyní ve výchozím nastavení volitelné. Tato změna byla zavedena v Nette 2.4. Nyní můžete odstranit `setRequired(false)`.
Nezapomeňte aktualizovat soubor `netteForms.js` na verzi 3! Můžete jej nainstalovat pomocí npm:
```shell
npm install nette-forms
```
Proměnné `ChoiceControl::$checkAllowedValues` a `MultiChoiceControl::$checkAllowedValues` byly nahrazeny metodou `checkDefaultValue()`.
Presentery & komponenty
-----------------------
Konstruktor `Nette\ComponentModel\Component` nebyl roky používán a byl odstraněn ve verzi 3.0. Je to BC break. Pokud voláte rodičovský konstruktor ve vaší komponentě nebo presenteru zděděném od `Nette\Application\UI\Presenter`, musíte volání odstranit.
Rozhraní `Nette\Application\IRouter` bylo změněno, viz "původní":https://github.com/nette/application/blob/v2.4.0/src/Application/IRouter.php a "nové":https://github.com/nette/routing/blob/v3.0.0/src/Routing/Router.php.
Nyní metoda `match()` vrací a `constructUrl()` přijímá pole parameterů namísto objektu `Nette\Application\Request`.
Nette nyní zkontroluje, zda každý signal je odeslán ze stejného *originu* (tj. ze stejné domény a subdomény). Same-origin policy je kritický bezpečnostní mechanismus, který pomáhá redukovat možné vektory útoku.
Pokud chcete povolit další *původy*, přidejte k metodě obsluhující signál anotaci `@crossOrigin`:
```php
/**
* @crossOrigin
*/
function handleXy()
{
}
```
To platí také pro předkládání formulářů. Pokud chcete povolit odesílání z jiného *původu*, postupujte takto:
```php
$form = new Nette\Application\UI\Form;
$form->allowCrossOrigin();
```
Dependency Injection
--------------------
Byla ostraněna podpora INI souborů.
Byl odstraněn přímý zápis PHP kódu do konfigurace pomocí otazníků. Např:
```neon
setup:
- "$service->onError[] = ?"([@Some\Logger, logApplicationError])
```
lze nahradit za:
```neon
setup:
- '$onError[]' = [@Some\Logger, logApplicationError]
```
V konfiguračních souborech byste místo `class: PDO(...)` měli použít `factory: PDO(...)`.
Tag `nette.presenter` se pro presentery už nepoužívá.
DI pro tvůrce Compiler Extensions
---------------------------------
Zatímco v Nette 2.4 interně popisoval každou službu objekt `Nette\DI\ServiceDefinition`, dnes existuje definic vícero. Například `Nette\DI\Definitions\ImportedDefinition ` pro importované neboli dynamic služby, `Nette\DI\Definitions\FactoryDefinition` pro generované továrničky na základě inteface, `Nette\DI\Definitions\AccessorDefinition` pro generované accessory a `Nette\DI\Definitions\ServiceDefinition` pro běžné služby.
Pro vytvoření nové definice tak existuje kromě `ContainerBuilder::addDefinition()` několik dalších metod: `addFactoryDefinition()`, `addAccessorDefinition()`, `addImportedDefinition()`.
Další
-----
Třída `Nette\Security\Passwords` se nyní používá jako objekt, tj. metody již nejsou statické.
Některé metody zejména z Nette Database, jako `fetch()` nebo `fetchField()`, v případě chyby (tj. když není další záznam) vracejí NULL místo FALSE.
Rozhraní `Nette\Localization\ITranslator` bylo změněno, viz "původní":https://github.com/nette/utils/blob/v2.5.0/src/Utils/ITranslator.php a "nové":https://github.com/nette/utils/blob/v3.0.0/src/Utils/ITranslator.php.
Objekt `Nette\Http\UrlScript`, který vrací třeba `Nette\Http\Request::getUrl()`, je nyní immutable.
V zápise `new Nette\Http\Url('abcd')` představuje `abcd` cestu, nikoliv doménu. Od verze 3.0 tedy `(new Nette\Http\Url('abcd'))->setScheme('http')` korektně vygeneruje `http:abcd` místo dřívějšího `http://abcd`.
`Nette\Object` je zastaralý od Nette 2.4 a odstraněný v Nette 3.0. Stále však existuje pod novým názvem `Nette\LegacyObject` (jméno `object` nelze používat od PHP 7.1) v balíčku "nette/deprecated":https://github.com/nette/deprecated.
{{priority: -5}}