Prosím o otestování Nette DI v3.0.12 RC a 3.1

David Grudl
Nette Core | 8117
+
+3
-

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() a get() 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 | 1166
+
0
-

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 | 199
+
0
-

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 | 8117
+
+1
-

@Marek Bartoš opraveno
@Gappa ad Tracy: doplnil jsem, aby to fungovalo i se starší verzí Latte než 2.10

David Šolc
Člen | 5
+
0
-

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
+
0
-

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)

Milo
Nette Core | 1283
+
+1
-

Tracy nádhera :)

David Grudl
Nette Core | 8117
+
+1
-

@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
+
0
-

@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 | 8117
+
0
-

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
+
0
-

ČSFD, taky všechno na první pohled běží jak má.

Forrest79
Backer | 7
+
0
-

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.