PHP 8.0; Nette 2.4; Robot loader; Ambiguous class HomepagePresenter resolution;

JaxP
Člen | 62
+
0
-

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

Dle té chybové hlášky to vypadá, že tam namespace uvedený v tom souboru nemáš. Můžeš jej ukázat?

JaxP
Člen | 62
+
0
-

Hlásí to každý presenter. Po přepnutí zpět na PHP 7.4.4 je vše zase ok.

namespace App\FrontModule\Presenters;

final class HomepagePresenter extends BasePresenter
{
  //...
}
namespace App\AdminModule\Presenters;

final class HomepagePresenter extends BasePresenter
{
  //...
}
David Matějka
Moderator | 6445
+
+1
-

a mas aktualni robot loader? ve verzi 3.3.1?

JaxP
Člen | 62
+
+1
-

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.

Možná to byl můj lokální problém s cached balíčky.
Děkuji za pomoc.

Šaman
Člen | 2658
+
0
-

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

Důvod: PHP 8 změnilo tokenizaci namespace, viz https://wiki.php.net/…mes_as_token.

David Grudl
Nette Core | 8218
+
0
-

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

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

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

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

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.

David Grudl
Nette Core | 8218
+
+2
-

Ok, vydal jsem robotloader 2.4.5