Circular reference detected for services

crassus
Backer | 75
+
0
-

Ahoj, před hodinou došlo k updatu https://github.com/nette/di kvůli kterému mi spadla celá aplikace. Vypisuje to:

Circular reference detected for services: application.application, routing.router, 93_App_Model_Product, 88_App_Model_Date, translation.default, translation.formatter.

Co může být špatně? Do modelu Product instancuji model Date. Translator mám v modelu Date. Nechápu jaká Circular reference tam může existovat?

Prosím o radu jak mohu tento problém vyřešit.

Editoval crassus (30. 11. 2018 14:45)

CZechBoY
Člen | 3608
+
0
-

Na jakou verzi si teda updatnul?
Napiš všechny závislosti všech výše zmíněných tříd.

crassus
Backer | 75
+
0
-

Mám verzi: nette/di (v2.4.14)

Model Product má: __construct(Context $db, App\Model\Date $date)
Model Date má: __construct(Nette\Localization\ITranslator $translator)

Na localhostu mi to ale funguje bez problémů.

Editoval crassus (30. 11. 2018 15:15)

crassus
Backer | 75
+
0
-

Aha tak ani na localhostu mi to nefunguje a pravděpodobně za to nemůže balíček DI, ale jeden z těchto:

composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 9 updates, 0 removals
 – Updating nette/application (v2.4.12 ⇒ v2.4.13): Downloading (100%)
 – Updating nette/database (v2.4.7 ⇒ v2.4.8): Downloading (100%)
 – Updating nette/mail (v2.4.5 ⇒ v2.4.6): Downloading (100%)
 – Updating nette/security (v2.4.3 ⇒ v2.4.4): Downloading (100%)
 – Updating chillerlan/php-qrcode (3.0.1 ⇒ 3.0.2): Downloading (100%)
 – Updating psr/log (1.0.2 ⇒ 1.1.0): Downloading (100%)
 – Updating symfony/filesystem (v4.1.7 ⇒ v4.2.0): Downloading (100%)
 – Updating symfony/config (v4.1.7 ⇒ v4.2.0): Downloading (100%)
 – Installing symfony/contracts (v1.0.0): Downloading (100%)
 – Updating symfony/translation (v4.1.7 ⇒ v4.2.0): Downloading (100%)
symfony/contracts suggests installing psr/container (When using the Service contracts)
symfony/contracts suggests installing symfony/cache-contracts-implementation ()
symfony/contracts suggests installing symfony/service-contracts-implementation ()
Writing lock file
Generating autoload files

crassus
Backer | 75
+
0
-

Hm tak nakonec za to může: Updating symfony/translation (v4.1.7 ⇒ v4.2.0): Downloading (100%)

CZechBoY
Člen | 3608
+
0
-

Proč by za circular referenci mohlo symfony/translation?
Jaký závislosti maj ty translator věci?

crassus
Backer | 75
+
0
-

Protože když dám downgrade na symfony/translation 4.1.7, tak to funguje.

Teď jsem z celého projektu vymazal Nette\Localization\ITranslator. Používám pouze: Kdyby\Translation\Translator.

Mám to jako extension:

translation: Kdyby\Translation\DI\TranslationExtension

Já ve svém zdrojáku žádnou circular referenci nemám. Musí to být nekompatibilitou toho translation rozšíření s Nette.

crassus
Backer | 75
+
0
-

Nemůže být problém v tom, že si v BasePresenteru ten translator instancuji takto:

/** @var \Kdyby\Translation\Translator @inject */
public $translator;

Ale pak zároveň v modelech ho instancuji přes konstruktor?

Šaman
Člen | 2632
+
0
-

crassus napsal(a):

Nemůže být problém v tom, že si v BasePresenteru ten translator instancuji takto:

/** @var \Kdyby\Translation\Translator @inject */
public $translator;

Ale pak zároveň v modelech ho instancuji přes konstruktor?

No, předpokládám, že instanci vytvoří DI kontejner a pak je to jedno – inject do public entity v presenterech, stejně jako předání závislosti konstruktorem jsou správné řešení. Ale asi bych tomu neříkal instancování.
Nebo opravdu někde v těch konstruktorech vytváříš Translator pomocí operátoru new? To by problém byl.

crassus
Backer | 75
+
0
-

Šaman napsal(a):

crassus napsal(a):

Nemůže být problém v tom, že si v BasePresenteru ten translator instancuji takto:

/** @var \Kdyby\Translation\Translator @inject */
public $translator;

Ale pak zároveň v modelech ho instancuji přes konstruktor?

No, předpokládám, že instanci vytvoří DI kontejner a pak je to jedno – inject do public entity v presenterech, stejně jako předání závislosti konstruktorem jsou správné řešení. Ale asi bych tomu neříkal instancování.
Nebo opravdu někde v těch konstruktorech vytváříš Translator pomocí operátoru new? To by problém byl.

Operátor new nepoužívám. Zkusil jsem teď úplně ze všech svých modelů odstranit Translator z konstruktoru a začlo to psát už jen:

Circular reference detected for services: application.application, routing.router, translation.default, translation.formatter

Tak jsem odstranil Translator i z RouterFactory a začlo to psát:

Circular reference detected for services: translation.default, translation.formatter

Takže teď už fakt nevím.

crassus
Backer | 75
+
0
-

Tady je screen z Tracy: SCREEN

CZechBoY
Člen | 3608
+
+2
-

Oni fakt udělali circular reference přímo v symfony/translation, paráda…

Translator vyžaduje MessageFormatter https://github.com/…anslator.php#L89
MessegeFormatter vyžaduje Translator https://github.com/…ormatter.php#L30

Šaman
Člen | 2632
+
0
-

Ok, jen mě zarazilo to slovo „instancování“.

Translátor nepoužívám, ale zkusil bych za prvé vymazat cache (jestli se to stalo po updatu a na localhostu to šlape, tak to docela ukazuje na něco nekompatibilního co zůstalo v tempu) a kdyby to nepomohlo, tak se podívat jestli se nezměnilo jak se to zapisuje v configu.

Ten screen totiž říká, že služba, kterou právě vytváříš, chce jako argument sama sebe…

Editoval Šaman (30. 11. 2018 17:56)

Roman Halaxa
Člen | 60
+
0
-

Potvrzuji stalo se mi to samé. Řešil jsem to zapsáním předchozí verze do composer.json prozatím.