Circular reference detected for services: translation.tracyPanel, translation.localeResolverRouter

crassus
Backer | 78
+
0
-

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

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

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

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

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)