Prosím o otestování Nette DI v3.0.12 RC a 3.1
- David Grudl
- Nette Core | 8218
Tato verze opravuje řadu bugů a přináší lepší podporu pro novinky v PHP 8.1. Protože to vyžadovalo změnit některé interní věci, prosím vás o otestování.
Vlastně stačí zjistit, jestli se korektně sestaví DI kontejner, tedy smazat cache a jednou spustit aplikaci. Případně i porovnat soubor s předchozím a novým kontejnerem, ale tady je potřeba říct, že se objeví nějaké změny u předávání volitelných argumentů metodám, které jsou ok.
composer require nette/di:v3.0.x-dev
Zároveň bych rád během krátké doby vydal verzi DI 3.1.0, což je jakýsi přechodový krok k chystané verzi 4.0, v tom smyslu, že by měla hlásit deprecated notices pro zastaralé věci, které by měly z 4.0 zmizet. Bylo by super, kdyby jste ji mohli vyzkoušet a dát vědět, jestli jste na nějakou deprecated věc narazili. Ať můžeme kdyžtak některé věci vrátit zpět nebo doladit.
composer require nette/di:v3.1.x-dev
Pokud by nějaké rozšíření odmítalo DI 3.1, můžete zkusit:
composer require "nette/di:v3.1.x-dev as v3.0.10"
Ok, když už teda testujete, zkuste ještě novou Tracy :-) Odměnou vám bude redesignovaný bluescreen s novým call stackem, nové záložky atd. A tato verze by zároveň měla fungovat bez session, což je asi to nejvíc, co mě zajímá, jestli bude fungovat ok.
composer require tracy/tracy:v2.9.x-dev
Díky!
Na které změny v DI 4.0 verze 3.1 upozorňuje:
- DI už automaticky nedoplňuje
null
u povinných nullable skalárních argumentů (např.function __construct(?string $path)
), protože tohle rozhodnutí by měl udělat uživatel - Je otázka, jestli má přestat doplňovat i
null
u povinných nullable objektů (např.function __construct(?Logger $logger)
). Já nevím, tak jsem to experimentálně vypnul a uvidíme, jestli se to osvědčí nebo to bude opruz - metody
create()
aget()
v rozhraní pro generované továrny musí mít definovaný typ - není už podporována anotace
@return
, musí se použít nativní typ - ve verzi DI 4.0 nebude podporována ani anotace
@var
při injectování do proměnné, ale na to 3.1 neupozorňuje, protože to lze zapsat až v PHP 7.4 - místo znaku
...
pro vynechání parametru se používá nově_
- není už potřeba escapovat znak
@
zdvojením, na nepotřebné escapování upozorní - zrušen klíč
parameters
v definicích generovaných továren (předpokládám, že už nepoužívá)
- Marek Bartoš
- Nette Blogger | 1260
Všechno funguje, jen Tracy mi zalogovala
TypeError TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given in /path/to/vendor/tracy/tracy/src/Tracy/Bar/Bar.php:84
- Gappa
- Nette Blogger | 207
DI 3.0.x
Bez problémů.
DI 3.1.x
Nahlásila tento problém:
The parameter $foo in Bar::__construct() should have a declared value in the configuration.
Tohle neprojde:
public function __construct(
string $a,
?string $b,
Baz $baz
)
3.0.x tam pro $b
doplní null
samo. Teď to
spadne – což je tedy předpokládám cílené, když je to User Deprecated
:) Po doplnění null
do .neon configu je vše ok.
Tohle ale také neprojde:
public function __construct(
string $a,
?string $b = null,
Baz $baz
)
Tohle v jiné třídě projde:
public function __construct(
string $a,
?string $b = null,
)
Tracy 2.9.x
Bez problémů.
Akorát na jedné ukázce jsem viděl, že pro chyby v latte to ukazovalo i zdroják šablonky (tedy latte jako takové). Toho se mi nedaří docílit. Zkoušel jsem vypsat neexistující proměnnou, ale vidím jen chybu ve zkompilovaném php – možnost, že jsem slepejš, ale vyloučit nemůžu :)
Editoval Gappa (14. 12. 2021 21:05)
- David Grudl
- Nette Core | 8218
@Marek Bartoš opraveno
@Gappa ad Tracy: doplnil jsem, aby to fungovalo i se starší verzí
Latte než 2.10
- David Šolc
- Člen | 5
Hlásím, že na poměrně velkém projektu s hodně závislostma (https://edu.ceskatelevize.cz/) funguje jak DI v3.1, tak Tracy v2.9, na „druhou“ dobrou .-))
Pouze jsem musel nahradit:
- místo znaku
...
pro vynechání parametru se používá nově_
- Milo
- Nette Core | 1283
Vyzkoušel jsem
composer require "nette/di:v3.1.x-dev as v3.0.10"
a po doplnění
null
parametrů se kontejner v pohodě sestavil (PHP 8.0.6). Pokud
ale optional parametr předchází povinnému, dostanu vynadáno také.
# User Deprecated: The parameter $name in Service::__construct() should have a declared value in the configuration.
public function __construct(
string $name = null,
Nette\Caching\Storage $storage,
) {}
Stejný případ jako @Gappa výše.
Když jako výchozí hodnotu použiju například
string $name = 'foo',
, dostanu vynadáno od PHP
Deprecated: Required parameter $storage follows optional parameter $name
.
O téhle „nekonzistenci“ v PHP jsem netušil, ale je to zdokumentované chování, takže to vlastně není optional
parametr, ale nullable typ.
Když změním pořadí, použije se očekávaně null.
public function __construct(
Nette\Caching\Storage $storage,
string $name = null,
) {}
Za mě tedy chování OK. Možná, ale nevím, jestli je to s reflexí možné, vypsat hint, že pokud chce člověk zachovat null, musí přesunout nepovinný parametr za povinné.
Editoval Milo (15. 12. 2021 8:40)
- David Grudl
- Nette Core | 8218
@Milo z pohledu PHP je to (tuším od verze 8) opravdu povinný parametr, takže to nejde poznat ani reflexí.
- Milo
- Nette Core | 1283
@DavidGrudl A co obecně, bez ohledu na tuhle atypičnost, tedy
i pro ?Type
, přidat hint:
User Deprecated
The parameter $name in Service::__construct() should have a declared value in the configuration. Or if you want to preserve it NULL, move parameter after required ones and set $name = null explicitly.
- David Grudl
- Nette Core | 8218
Tak se dívám, že to není rozlišitelné až od PHP 8.1. Pokud se u parametru neuvede typ (proč??), tak PHP 8.0 hlásí:
Deprecated: Required parameter $storage follows optional parameter $name
PHP 8.1 hlásí:
Deprecated: Optional parameter $name declared before required
parameter $storage is implicitly treated as a required parameter
Nevím, jestli uživateli radit, aby přehodil pořadí parametrů, to je dost odvážné, ale určitě by se ta hláška vylepšit dala.
- Forrest79
- Backer | 7
Jenom ještě poznámka k nové session, nezkoušel jsem to v praxi, ale
někdo může mít nastavené session.save_path
podobně jako (my
to tak máme, ale nastavuje to až DI extesion, pro Debugger je tam ještě
adresář):
session.save_handler = redis
session.save_path = "tcp://host1:6379?weight=1, tcp://host2:6379?weight=2&timeout=2.5, tcp://host3:6379?weight=2&read_timeout=2.5"
Takže v $dir = session_save_path() ?: ...
, který dělá
detekci, zda použít FileSession
pak bude něco, kam nejde
zapisovat soubory.