Nette Documentation Preview

syntax
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}}

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.*:

"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. Jednoduše ho zavoláte v projektu (tedy adresáři v němž jsou složky /vendor a /app):

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:

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í a nové. 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:

/**
 * @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:

$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ř:

	setup:
		- "$service->onError[] = ?"([@Some\Logger, logApplicationError])

lze nahradit za:

	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í a nové.

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.