Vše o vydání Nette 3.0 (průběžně aktualizováno)

David Grudl
Nette Core | 8082
+
+48
-

V tomto vlákně postupně aktualizovat informace kolem vydání Nette 3.0.

Pro dotazy si prosím zakládejte samostatné vlákna, děkuji.

Přehled balíčků

Ano, 4/5 frameworku už jsou ve stable verzi. Zbývající pětina čeká na vaše otestování a vyjde velmi brzo.

Úplně všechny balíčky jsou určeny pro PHP 7.1, běží pod striktním režimem a mají plně otypované parametry a návratové hodnoty metod. Nette je tak jedním z úplně prvních plně PHP 7 frameworků na světě.

Zároveň také Nette už dávno není monolit, rychlost vývoje jednotlivých balíčků se může lišit, takže zatímco Php-Generator je již ve verzi 3.2, vydání major verzí Latte a Tracy je v plánu přibližně za půl roku.

Novinkou je balíček Routing, který vznikl oddělením od Application a pro lepší srozumitelnost rovnou startuje verzí 3.0.

David Grudl
Nette Core | 8082
+
+17
-

Nette 3 přichází se spoustou novinek, o kterých budu postupně informovat na Nette Blogu, teď se spíš zaměřím na migraci.

Přes poměrně velké změny, které můžete vyčíst v release notes, by přechod měl být poměrně snadný. Mám ohlasy, že v mnoha případech nebylo potřeba měnit vůbec nic. Nette tradičně dbá na zpětnou kompatibilitu a pokud ji někde poruší, snaží se dávat co nejsrozumitelnější chybové hlášky.

Několik důležitých bodů:

  • je nutné aktualizovat i netteForms.js
  • pokud zatím nechcete řešit E_USER_DEPRECATED zprávy, vypněte je pomocí error_reporting(E_ALL & ~E_USER_DEPRECATED) a to až po zapnutí Tracy
  • aktualizujte vždy postupně, takže nikoliv z Nette 2.3 na 3.0, ale nejprve na 2.4 a poté na 3.0
  • pokud máte translátory nebo vlastní routy, došlo ke změně rozhraní ITranslator a IRouter
  • zmizel konstruktor u Component, takže v jeho potomcích nebude fungovat parent::__construct()
  • pro autory rozšíření pro Dependency Injection je tu podrobnější shrnutí
  • kvůli bezpečnosti (CSRF) se nyní kontroluje, zda signály přicházejí ze stejné domény. Pokud jej posíláte z jiné, doplňte u metody handle anotaci @crossorigin
  • objekt UrlScript, který vrací třeba Nette\Http\Request::getUrl(), je nyní stejně jako Request immutable
  • třída Nette\Security\Passwords se nyní používá jako objekt, který si předáte přes konstruktor
  • některé metody zejména z Nette Database, jako fetch() nebo fetchField() v případě chyby (tj. není další záznam) vracejí NULL místo FALSE
David Grudl
Nette Core | 8082
+
+17
-

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

Tedy je potřeba stejné typehinty doplnit i do přepisované metody.

Dobrá zpráva je, že jsem připravil nástroj, který je umí doplnit automaticky. A to dokonce nejen pro konkrétní verzi Nette, nebo jen pro framework Nette, ale funguje úplně obecně. Prostě mu předhodíte svůj projekt, on projde všechny zdrojové kódy a ověří, zda v dědičné hierarchii nedochází k nekompatibilitě signatur. A pokud ano, umí je dokonce opravit.

Nástroj se jmenuje Nette TypeFixer a jednoduše ho zavoláte nad projektem, tedy adresářem, v němž jsou složky /vendor i /app:

typefixer --fix my-project-dir

Samozřejmě předtím vše raději zazálohujte.

Petr Parolek
Člen | 455
+
0
-

Ahoj,

neměly by být verze 3 u balíčků latte a tracy namísto latte 2.5.x a tracy 2.6.x?

Problém nastává s nekompabilitou mnoha extensions, když použiju v composer.json:

		"nette/application": "^2.4.4",
		"nette/bootstrap": "^2.4.3",
		"nette/caching": "^2.5",
		"nette/di": "^2.4",
		"nette/finder": "^2.4",
		"nette/forms": "^2.4",
		"nette/http": "^2.4",
		"nette/mail": "^2.4",
		"nette/robot-loader": "^2.4 || ^3.0",
		"nette/safe-stream": "^2.3",
		"nette/security": "^2.4",
		"nette/utils": "^2.4",
		"latte/latte": "^2.4",
		"tracy/tracy": "^2.4",
		"kdyby/doctrine": "@dev",
		"kdyby/events": "@dev"

Jde o o to, že se nainstalují „trojkové verze“ latte a tracy, kterou jsou stéle „dvojkové“

Nebo se má spíše používat u projektů:

		"nette/application": "~2.4.0",
		"nette/bootstrap": "~2.4.0",
		"nette/caching": "~2.5.0",
		"nette/di": "~2.4.0",
		"nette/finder": "~2.4.0",
		"nette/forms": "~2.4.0",
		"nette/http": "~2.4.0",
		"nette/mail": "~2.4.0",
		"nette/robot-loader": "^2.4 || ^3.0",
		"nette/safe-stream": "^2.3",
		"nette/security": "~2.4.0",
		"nette/tokenizer": "^2.3",
		"nette/utils": "^2.4",
		"latte/latte": "~2.4.0",
		"tracy/tracy": "~2.5.0"

?

Editoval ppar (21. 2. 2019 13:53)

David Grudl
Nette Core | 8082
+
0
-

Můžeš na to prosím založit vlastní vlákno a napsat tam, jakých extension se to týká a o jaké problémy jde?

hrach
Člen | 1834
+
0
-

Existuje Nette Finder 3.0.0-RC1, ale zde se pise, jakoby max. bylo 2.5.0, to je chyba, ne?

Editoval hrach (10. 3. 2019 16:52)

David Grudl
Nette Core | 8082
+
0
-

Finder 3.0.0 teprve vyjde, ještě tam chci něco dokončit. Ale zároveň kvůli tomu nechci oddalovat dokončení zbytku, takže odstatní knihovny používají 2.5.

forgie
Bronze Partner | 18
+
0
-

Ahoj,

mám dva dotazy:

  1. jak nyní, v Nette 3.0 doporučuješ řešit výchozí hodnoty konfigurace u CompilerExtension? Toto asi nebude platit dloho: https://doc.nette.org/…n/extensions#… , protože aktuální \Nette\DI\CompilerExtension::validateConfig() je deprecated a getConfigSchema nepodporuje předávání žádných parametrů: https://github.com/…xtension.php#L70 a navíc \Nette\DI\CompilerExtension::$config může být jak array tak i objekt, v Nette 2.4 to bylo vždy jen array.
  2. vlastní router: https://doc.nette.org/…tion/routing#… ::match() vrací místo Request jenom ?array a constructUrl(array $params, Nette\Http\UrlScript $refUrl) má místo prvního parametru Nette\Application\Request taky jen array $params. Asi to bude to samé pole, pravda, nakolik nikde není popsané víc jak to, že to pole bude pole obsahující jméno presenteru a jeho parametry a to, že to pole vrácené match() a přijaté do constructUrl pole bude identické tam není explicitně spomenuto; případně jak s tím polem pracovat (Je možné si do něj uložit jako parametry presenteru „cokoliv“?).

Díky za pomoc

Editoval forgie (15. 4. 2019 23:00)

David Grudl
Nette Core | 8082
+
0
-

ad 1)

ve schématu se výchozí hodnoty předávají buď pomocí ->default(...), nebo zjednodušeně jako parametr funkce Expect, např. Expect::string('vychozi hodnota').

ad 2)

Pole je vlastně totéž jako dříve pole parametrů v Request, jen jeho součástí je nyní i klíč presenter s názvem presenteru. A je to jak píšeš, obě pole jsou stejná.

MajklNajt
Člen | 470
+
0
-

David Grudl napsal(a):
ad 2)

Pole je vlastně totéž jako dříve pole parametrů v Request, jen jeho součástí je nyní i klíč presenter s názvem presenteru. A je to jak píšeš, obě pole jsou stejná.

prečo vlastne došlo k takejto zmene? nebolo lepšie, keď tie parametre a návratové hodnoty mali jasne definovanú triedu?

Milo
Nette Core | 1283
+
+3
-

Z routeru je teď samostatná komponenta a nemá smysl, aby výsledkem routeru byla specifická implementace, tedy Nette\Application\Request. Jediná práce routeru je rozebrat URL na parametry a/nebo z parametrů poskládat URL. Na to pole stačí.

CzeM
Člen | 9
+
+1
-

Ahoj,
migruju projekt na Nette 3 a narážím na problémy s anotacemi. Mám napsané vlastní ACL se čtením anotací, avšak po migraci mi metoda getAnnotation vrací vždy pouze poslední prvek z hodnoty anotace, nikoliv celé pole.

Je to žádoucí chování, nebo jde o chybu?

V ComponentReflection.php by mělo jít o řádek 270:

<?php
public function getAnnotation(string $name)
	{
		$res = self::parseAnnotation($this, $name);
		return $res ? end($res) : null;
	}
?>

Díky za jakoukoliv reakci, možná na to již musím jinak.

marek-m
Člen | 66
+
0
-

CzeM napsal(a):

Ahoj,
migruju projekt na Nette 3 a narážím na problémy s anotacemi. Mám napsané vlastní ACL se čtením anotací, avšak po migraci mi metoda getAnnotation vrací vždy pouze poslední prvek z hodnoty anotace, nikoliv celé pole.

Je to žádoucí chování, nebo jde o chybu?

V ComponentReflection.php by mělo jít o řádek 270:

<?php
public function getAnnotation(string $name)
	{
		$res = self::parseAnnotation($this, $name);
		return $res ? end($res) : null;
	}
?>

Díky za jakoukoliv reakci, možná na to již musím jinak.

ako si to nakoniec poriesil?

marek-m
Člen | 66
+
0
-

:-) composer require nette/reflection

marek-m napsal(a):

CzeM napsal(a):

Ahoj,
migruju projekt na Nette 3 a narážím na problémy s anotacemi. Mám napsané vlastní ACL se čtením anotací, avšak po migraci mi metoda getAnnotation vrací vždy pouze poslední prvek z hodnoty anotace, nikoliv celé pole.

Je to žádoucí chování, nebo jde o chybu?

V ComponentReflection.php by mělo jít o řádek 270:

<?php
public function getAnnotation(string $name)
	{
		$res = self::parseAnnotation($this, $name);
		return $res ? end($res) : null;
	}
?>

Díky za jakoukoliv reakci, možná na to již musím jinak.

ako si to nakoniec poriesil?