PHP 8.0; Nette 2.4; Robot loader; Ambiguous class HomepagePresenter resolution;
- JaxP
- Člen | 62
Zdravím,
po změně na PHP 8.0.0 a aktualizaci vendor balíčků končím
s výjimkou:
Ambiguous class HomepagePresenter resolution; defined in CestaDoProjektu\app\_AdminModule\presenters\HomepagePresenter.php and in CestaDoProjektu\app\_FrontModule\presenters\HomepagePresenter.php.
Je to očekávané chování Robot-loaderu? Vždy jsem používal stejné názvy tříd pro všechny moduly a odlišoval jsem je různým namespacem. Po aktualizaci to vypadá, že to už možné není.
- David Matějka
- Moderator | 6445
Dle té chybové hlášky to vypadá, že tam namespace uvedený v tom souboru nemáš. Můžeš jej ukázat?
- Šaman
- Člen | 2658
Měl jsem teď stejný problém při upgradu na PHP 8.0.1.
Balíčky jsem měl rozepsané, ale "nette/robot-loader": "^2.4"
a
po composer update
mi to tvrdilo, že mám Ambiguous class ve dvou
souborech, ve kterých se lišily namespace.
Naštěstí to vypadá, že i starý projekt na Nette 2.4 jede s
"nette/robot-loader": "^3.0"
. Ale docela dlouho mi trvalo najít
řešení, protože jsem nečekal, že RobotLoader 2.4 nad novým PHP přestal
rozeznávat namespace. A nebýt tohoto vlákna, hledám to asi doteď.
Editoval Šaman (1. 2. 2021 8:41)
- Jan Tvrdík
- Nette guru | 2595
Důvod: PHP 8 změnilo tokenizaci namespace, viz https://wiki.php.net/…mes_as_token.
- David Grudl
- Nette Core | 8218
Ne. Mám uvedené pouze „nette/nette“: „~2.4“ a s tím se stáhl nette/robot-loader (v3.1.1). Verze 3.2.* a 3.3.* nesplňují požadavky na ostatní knihovny, ale manuální require „nette/robot-loader“: „3.1.2“ pomohl.
Tohle nikdy nechápu. Protože „nette/nette“: „~2.4“ umožňuje instalovat „nette/robot-loader“: „3.1.2“, který je kompatibilní s PHP 8. Nakonec i manuální require ho v klidu nainstaloval. Proč se bez toho ale stáhla verze v3.1.1, nechápu.
Je fakt, že hodně divných situací mi pomohlo vyřešit smazání celé složky vendor a čerstvý composer install.
- David Grudl
- Nette Core | 8218
Btw začal jsem u balíčků limitovat i maximální povolenou verzi PHP, tak snad to v budoucnu pomůže před podobnými konflikty.
…Ale spíš asi vytvoří úplné nové :-)
- Šaman
- Člen | 2658
Taky jsem si říkal, ale pak… taky jsem si říkal :D
Jen teda, bylo by možné vypustit nějakou verzi ^2.4
podmíněnou PHP 8? Protože jinak se projekt se závislostmi Nette 2.4 po
přesunu na nové PHP odmítne při composer update
zaktualizovat.
A uživatel si bude tuhle (zatím jedinou nalezenou) nekompatibiltu vygooglit,
zjistit, že nový RobotLoader by měl být kompatibilní s 2.4 balíčky a
ručně mu v composer.json
zvednout verzi.
David Grudl napsal(a):
Tohle nikdy nechápu. Protože „nette/nette“: „~2.4“ umožňuje instalovat „nette/robot-loader“: „3.1.2“, který je kompatibilní s PHP 8. Nakonec i manuální require ho v klidu nainstaloval. Proč se bez toho ale stáhla verze v3.1.1, nechápu.
Nevím už, jestli jsem na ty závislosti nesahal ručně, ale základem byl
myslím nějaký pár let starý web-project
. Ale nemám
~2.4
, nýbrž ^2.4
. Což je vlastně potřeba,
protože přeci nechci přejít při pouhém composer update
na
Nette 3.
Editoval Šaman (1. 2. 2021 20:55)
- David Grudl
- Nette Core | 8218
S „nette/nette“: „^2.4“ to samozřejmě má fungovat taky.
Jen teda, bylo by možné vypustit nějakou verzi ^2.4 podmíněnou PHP 8?
Nevím, jak to myslíš, ale můžu udělat třeba 2.6, která bude pro PHP 8 (2.5 už existuje). Ale podle mě to nic neřeší.
- Šaman
- Člen | 2658
Nemyslel jsem "nette/nette": "^2.4"
ale
"nette/robot-loader": "^2.4"
. Tak, jak to bylo uvedeno ve
web-projectu.
Poslední web-project
s RobotLoaderem 2.4: https://github.com/…omposer.json
(další verze ze srpna 2017 už uvádí ^2.4 || ^3.0
)
Uznávám, že už je to téměř 4 roky starý kód, ale na druhou stranu
jinak je verze 2.4 s PHP 8 kompatibilní, ne? (Já zatím jiný problém
nenašel.)
David Grudl napsal(a):
Nevím, jak to myslíš, ale můžu udělat třeba 2.6, která bude pro PHP 8 (2.5 už existuje). Ale podle mě to nic neřeší.
Jo, přesně to jsem myslel. Nezkoušel jsem, jestli je nový RobotLoader
zpětně kompatibilní (tedy jestli ten pro PHP 8 funguje i na PHP 7 a
dokonce 5.6), ale pokud ano, tak to řeší problém přenesení projektu
postaveném na Nette 2.4 na hosting s novým PHP 8. A to pouhým
composer update
.
Alespoň pokud programátor používá definici balíčků stejnou, jako ukazuje
web-project
.