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.