Multiple services of type
- johnnie
- Člen | 54
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.
- Marek Bartoš
- Nette Blogger | 1280
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()
- Matúš Matula
- Člen | 257
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
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
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
@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
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.