Vše o vydání Nette 3.0 (průběžně aktualizováno)
- David Grudl
- Nette Core | 8218
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ů
- Application: RC release notes
- Bootstrap: RC release notes
- Caching: 3.0.0 release notes
- Component-Model: 3.0.0 release notes
- Database: 3.0.0 release notes
- DI: RC release notes
- Finder: 2.5.0 release notes
- Forms: 3.0.0 release notes
- Http: 3.0.0 release notes
- Latte: 2.5.0 release notes
- Mail: 3.0.0 release notes
- Neon: 3.0.0 release notes
- Php-Generator: 3.2.0 release notes
- Robot-Loader: 3.1.0 release notes
- Routing: 3.0.0 release notes
- Security: 3.0.0 release notes
- Tester: 2.1.0 release notes
- Tracy: 2.6.0 release notes
- Utils: 3.0.0 release notes
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 | 8218
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()
nebofetchField()
v případě chyby (tj. není další záznam) vracejí NULL místo FALSE
- David Grudl
- Nette Core | 8218
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
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 | 8218
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?
- David Grudl
- Nette Core | 8218
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
Ahoj,
mám dva dotazy:
- 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 agetConfigSchema
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. - vlastní router: https://doc.nette.org/…tion/routing#…
::match()
vrací místoRequest
jenom?array
aconstructUrl(array $params, Nette\Http\UrlScript $refUrl)
má místo prvního parametruNette\Application\Request
taky jenarray $params
. Asi to bude to samé pole, pravda, nakolik nikde není popsané víc jak to, že to pole budepole 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 | 8218
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 | 493
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?
- CzeM
- Člen | 9
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
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 metodagetAnnotation
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
:-) 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 metodagetAnnotation
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?