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.