Class XY not found v PHP8.1

Kajda23
Člen | 42
+
0
-

Ahoj,
řeším pro mě poměrně zvláštní věc, které nerozumím a už nevím kudy.

Upravuji poměrně rozsáhlý projekt z původního PHP 7.2 na PHP 8.1. Prošel jsem postupně všechny předchozí verze PHP poměrně bez problémů, až u verze 8.1 jsem narazil. Jakákoliv služba zapsaná v configu je not found. Třídy existují, robot loader má nastavenu příslušnou složku, cache je smazaná. Na PHP 8.0 bez jakéhokoliv zásahu kromě smazání cache všechno šlape, na PHP 8.1 Nette\DI\ServiceCreationException Class ‚XY‘ not found.

Setkal se někdo? Dal bych víc informací, ale ani náznakem nevím, co je podstatné a co ne.

Marek Bartoš
Nette Blogger | 1260
+
+1
-

Aktualizoval jsi i Nette? S PHP 8.1 potřebuješ Nette 3.1
https://nette.org/en/maintenance#…

Vždy když děláš update PHP bys měl v composer.json zapsat, na které verzi PHP aplikace pojede v produkci a zkusit spustit composer update

{
	"config": {
		"platform": {
			"php": "8.1.5"
		}
	}
}
Kajda23
Člen | 42
+
0
-

Díky za odpověď.
Verzi PHP jsem zapsal. Nette jsem měl po balíčkách a nebyl jsem si jistý 100% aktuálností všech skrz závislosti. Odstranil jsem všechny a nainstaloval nejaktuálnější composer require nette/nette. Vymazal jsem cache, ale žádná změna.

Marek Bartoš
Nette Blogger | 1260
+
0
-

Zkus composer outdated, nette/robot-loader potřebuješ mít ve verzi 3.4.1, která přidává podporu pro PHP 8.1
Že jsi smazal seznam všech balíků a nechal Composer nainstalovat nejnovější možné ještě neznamená, že se nainstalovaly nejnovější. Můžeš tam mít další balíky, které vyžadují starší verze.
Pokud se ti třeba nette/robot-loader zobrazuje ve starší verzi, tak pomocí composer why-not nette/robot-loader 3.4.1 zjistíš, který balík ti to blokuje.
Buď konflikt vyřešíš nebo můžeš vyžadovat "nette/robot-loader": "3.4.1 as x.x.x". Přičemž x.x.x je tvoje aktuální verze. Konflikt tak obejdeš, ale riskuješ, že se tím knihovna vyžadující jinou verzi robot loaderu rozbije.

Editoval Marek Bartoš (4. 10. 2022 9:48)

Kajda23
Člen | 42
+
0
-

Nette je plně aktuální. Robot loader 3.4.1.

Kajda23
Člen | 42
+
0
-

Tak jen pro zajímavost, složka s některými servisními třídami je v projektu jako junction (symlink). Ty, které jsou v této složce, nejsou načteny, ty, které jsou v normální složce u projektu načteny robot loaderem jsou. Na vině je zřejmě nějaký bug nebo omezení PHP 8.1 na Windows, který neumí pracovat s junction složkami. V nižších verzích všechno funguje.

Kajda23
Člen | 42
+
0
-

A ještě úplné upřesnění, jde zřejmě o bug PHP 8.1 a je to v třídě RecursiveIteratorIterator. Ta nevyslídí soubory v symlinkované (junction) složce na Windowsech.