Multiple services of type

johnnie
Člen | 54
+
0
-

Ahojte,

upgradujem nasu internu sandbox appku na nette(2.4 ⇒ 3.0), narazil som na tento problem.

Multiple services of type App\AdminModule\Presenters\DefaultPresenter found: application.2, application.4, application.5, application.6, application.7.

Aktualne sa cez to neviem posunut dalej, adresarova struktura je

/app/AdminModule
/app/FrontModule
/app/presenters/BasePresenter.php

Admin modul – DefaultPresenter.php

class DefaultPresenter extends \App\Presenters\BasePresenter

Front module – DefaultPresenter.php

class DefaultPresenter extends \App\Presenters\BasePresenter

Mapping v config.neon

application:
	errorPresenter: Error
	mapping:
		*: App\*Module\Presenters\*Presenter

Neviete nahodu prosim poradit ? Zjavne je tam problem len v tej AdminModule/presenters/DefaultPresenter.php, nakolko ostatne presentre v admin module mi funguju.

Matúš Matula
Člen | 257
+
0
-

Ahoj, vyriesil si to? Mam podobny problem..

David Matějka
Moderator | 6445
+
0
-

muzes ukazat tracy s callstackem?

Marek Bartoš
Nette Blogger | 1165
+
0
-

Nette by mělo u všech presenterů autowiring vypínat. Hádám, že registruješ presentery v nějaké extension v beforeCompile() a přestalo to fungovat, protože se změnily mezi verzemi priority extensions. Jako hotfix by mohlo zafungoval autowiring vypnout přes DecoratorExtension a pokud nezabere, tak vypnout autowiring u jednotlivých služeb. Obecně vzato by mělo stačit presentery registrovat v neonu přidaném přes Configurator nebo v CompilerExtension::loadConfiguration()

https://github.com/…xtension.php#…

Matúš Matula
Člen | 257
+
0
-

Sorry, nevsimol som si, ze niekto odpisal (zabudol som odoberat odpovede emailom)

Kazdopadne, neviem cim to bolo, ale restart webserveru pomohol (menil som php verzie kvoli niecomu a zrazu ta chyba zmizla aj na povodnej php verzii) .. skoda ze asi po 2h ‚debugovania‘ :)

johnnie
Člen | 54
+
0
-

Ja ked premenujem presenter tak to chvilu funguje a potom zase prestane, skusal som mazat cache a nic

Bootstrap.php

<?php

declare(strict_types=1);

namespace App;

use Nette\Configurator;

define('WWW_DIR', __DIR__ .'/../www');
define('ROOT_DIR', __DIR__ .'/..');


class Bootstrap
{
	public static function boot(): Configurator
	{
		$configurator = new Configurator;

		//$configurator->setDebugMode('23.75.345.200'); // enable for your remote IP
		$configurator->enableTracy(__DIR__ . '/../log');

		$configurator->setTimeZone('Europe/Prague');
		$configurator->setTempDirectory(__DIR__ . '/../temp');

		$configurator->createRobotLoader()
			->addDirectory(__DIR__)
			->register();

		$configurator->addConfig(__DIR__ . '/config/common.neon');
		$configurator->addConfig(__DIR__ . '/config/local.neon');

		return $configurator;
	}
}

common.neon

application:
	errorPresenter: Error
	mapping:
		*: App\*Module\Presenters\*Presenter

Tracy call stack


Prave som si vsimol ze ak mam

App\Presenters\BasePresenter
App\FrontModule\Presenters\HomePresenter extends BasePresenter
App\FrontModule\Presenters\EshopPresenter extends BasePresenter
App\FrontModule\Presenters\ProductPresenter extends HomePresenter

tak v tom pripade sa mi zacne zobrazovat tato chyba (ked dedim HomePresenter), doteraz som bezne takto dedil, robim v niecom chybu ?

Editoval johnnie (24. 10. 2019 11:38)

David Matějka
Moderator | 6445
+
+4
-

@johnnie asi by se to mohlo povazovat za chybu, ale rozhodne bych se takovemu pristupu vyhnul. presenter ma byt bud abstract nebo final. jestli hledas zpusob, jak sdilet kod mezi vice presentery, tak muzes treba pridat dalsi abstraktni mezi-presenter, muzes pouzit traity nebo to kompozici rozlozit do komponent napriklad.

johnnie
Člen | 54
+
0
-

David Matějka napsal(a):

@johnnie asi by se to mohlo povazovat za chybu, ale rozhodne bych se takovemu pristupu vyhnul. presenter ma byt bud abstract nebo final. jestli hledas zpusob, jak sdilet kod mezi vice presentery, tak muzes treba pridat dalsi abstraktni mezi-presenter, muzes pouzit traity nebo to kompozici rozlozit do komponent napriklad.

rozumiem, vdaka za vysvetlenie.