Přechod na verzi 3.0

Minimální požadovaná verze PHP je 7.1.

Aktualizujte vždy postupně, takže nikoliv z Nette 2.3 na 3.0, ale nejprve na 2.4 a poté na 3.0.

Před testováním nebo nasazováním doporučujeme nejprve vypnout hlášení chyb E_USER_DEPRECATED a povolit jej, až když vše bude fungovat:

$configurator->enableDebugger();
error_reporting(~E_USER_DEPRECATED); // note ~ before E_USER_DEPRECATED

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:
        - '$service->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.