Circular reference detected for services
- crassus
- Backer | 78
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)
- crassus
- Backer | 78
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 | 78
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.
- Šaman
- Člen | 2663
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 | 78
Š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átorunew
? 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.
- CZechBoY
- Člen | 3608
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 | 2663
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
Potvrzuji stalo se mi to samé. Řešil jsem to zapsáním předchozí verze do composer.json prozatím.