Circular reference detected for services: translation.tracyPanel, translation.localeResolverRouter
- crassus
- Backer | 77
Ahoj,
při upgradu z Nette 2.4 na 3.1 jsem mimo jiné přešel z balíčku Kdyby\Translation na Contributte\Translation, který mi začal vyhazovat chybu uvedenou v titulku.
Chyba se objeví jakmile zavolám jakoukoliv metodu na objektu Nette\Localization\ITranslator, který mám vloženy přes konstruktor do svého modelu LocaleSupport.
Nikde v projektu jinak ITranslator nemám nainstancovaný.
Tady je screenshot z Tracy: https://ibb.co/6yZryP2
Tady je ukázka modelu:
<?php
namespace App\Model;
use Nette;
use Nette\Neon\Neon;
use Contributte\Translation\Translator;
use Minwork\Helper\Arr;
final class LocaleSupport
{
use Nette\SmartObject;
/** @var Nette\Localization\ITranslator */
private $translator;
/** @var mixed[] */
private $langs;
/** @var mixed[] */
private $currencies;
/**
* @param mixed[] $langs
* @param mixed[] $currencies
* @param Nette\Localization\ITranslator $translator
*/
public function __construct
(
$langs,
$currencies,
Translator $translator
)
{
$this->langs = $langs;
$this->currencies = $currencies;
$this->translator = $translator;
$this->translator->translate('test'); //tento řádek vyhazuje chybu
}
}
Nevíte prosím někdo co se s tím dá dělat? Děkuji.
Editoval crassus (15. 3. 2021 0:34)
- Ondřej Kubíček
- Člen | 494
do constuctoru posíláš jinou třídu, než co máš jako anotaci u property
správně:
__construct(Nette\Localization\ITranslator $translator)
to vidíš i v docu té property $translator
/** @var Nette\Localization\ITranslator */
private $translator;
A ty do constructoru posíláš
Contributte\Translation\Translator
- crassus
- Backer | 77
Ondřej Kubíček napsal(a):
do constuctoru posíláš jinou třídu, než co máš jako anotaci u property
správně:
__construct(Nette\Localization\ITranslator $translator)
to vidíš i v docu té property
$translator
/** @var Nette\Localization\ITranslator */ private $translator;
A ty do constructoru posíláš
Contributte\Translation\Translator
Bohužel ani když opravím třídu na Nette\Localization\ITranslator, tak to pořád píše stejnou chybu. Zkoušel jsem tam instacovat také ten Contributte\Translation\Translator, protože ITranslastor je depracated, ale stejně to vyhazuje pořád stejnou chybu.
- crassus
- Backer | 77
Zjistil jsem, že chyba vzniká kvůli autowiringu v RouterFactory. Jakmile vložím závislost LocaleSupport jako vstupní parametr do metody createRouter, tak se objeví zmíněná chyba.
<?php
declare(strict_types=1);
namespace App\Router;
use Nette;
use App\Model\LocaleSupport;
use Nette\Application\Routers\RouteList;
use Nette\Application\Routers\Route;
final class RouterFactory
{
use Nette\StaticClass;
public static function createRouter(LocaleSupport $localeSupport): RouteList
{
$router = new RouteList();
$router->addRoute('', [
'presenter' => 'App',
'action' => 'default',
NULL => [
Route::FILTER_IN => function($url) use ($localeSupport)
{
bdump($localeSupport);
return $url;
}
]
]);
return $router;
}
}
Víte někdo jak v metodě createRouter využít třídy LocaleSupport, abych nedostával circular reference?
Editoval crassus (15. 3. 2021 14:26)
- crassus
- Backer | 77
Tak přišel jsem na chybu, měl jsem v configu:
translation:
localeResolvers:
- Contributte\Translation\LocalesResolvers\Router
Nahradil jsem to za:
translation:
localeResolvers:
- Contributte\Translation\LocalesResolvers\Parameter
- Contributte\Translation\LocalesResolvers\Session
- Contributte\Translation\LocalesResolvers\Header
Nyní to již circular reference nevyhazuje.
Editoval crassus (15. 3. 2021 16:17)