Invalid link: Cannot load presenter – špatný namespace po odchycení události
- svezij
- Člen | 69
Ahojte, máme problém s vytvořením odkazu po odchycení události přes Kdyby/Events. Zkusím problém lépe popsat. Máme následující skripty:
NetteListener.php
<?php
namespace mysys\core\listeners;
use Kdyby\Events\Subscriber;
use Nette\Application\Application;
use Nette\Application\UI\Presenter;
use Nette\Object;
use mysys\core\MyApp;
class NetteListener extends Object implements Subscriber
{
/** @var MyApp */
private $app;
public function __construct(MyAPP $app) { // DI
$this->app = $app;
}
/**
* @inheritdoc
*/
public function getSubscribedEvents(): array {
return ['Nette\Application\Application::onPresenter'];
}
/**
* Obslouží událost objektu Nette\Application\Application po vytvoření požadavku uživatele a aktuálního presenteru.
*
* @param Application $application
* @param Presenter $presenter
*/
public function onPresenter(Application $application, Presenter $presenter) {
$this->app->run($application, $presenter); // spuštění naší aplikace
}
}
?>
MyApp.php
<?php
namespace mysys\core;
use Kdyby\Events\EventArgsList;
use Kdyby\Events\EventManager;
use Nette\Application\Application;
use Nette\Application\UI\Presenter;
use Nette\Object;
final class MyApp extends Object
{
/** @var EventManager */
private $observer;
/** @var Application */
private $application;
/** @var Presenter */
private $presenter;
/**
* Provede DI.
* @param EventManager $observer
*/
public function __construct(EventManager $observer) {
$this->observer = $observer;
}
/**
* Spustí aplikaci MyApp.
*
* @param Application $application
* @param Presenter $presenter
*/
public function run(Application $application, Presenter $presenter) {
$this->application = $application;
$this->presenter = $presenter;
// oznami systemu, ze aplikace MyApp byla spustena
$this->observer->dispatchEvent(__CLASS__ . '::onStarted', new EventArgsList([$this]));
}
/**
* @return Application
*/
public function application(): Application {
return $this->application;
}
/**
* @return Presenter
*/
public function presenter(): Presenter {
return $this->presenter;
}
}
?>
TestPresenter.php
<?php
namespace mysys\admin\presenters;
use mysys\core\MyApp;
use Tracy\Debugger;
class TestPresenter extends AdminPresenter {
public function getSubscribedEvents(): array {
return ['mysys\core\MyApp::onStarted'];
}
public function renderDefault() {
Debugger::barDump($this->link('Test:'), 'render default');
}
public function onStarted(MyApp $myapp) {
Debugger::barDump($myapp, 'start aplikace v test presenteru');
Debugger::barDump($this->link('Test:'));
Debugger::barDump($myapp->presenter()->link('Test:'));
}
}
?>
AdminPresenter implementuje Kdyby\Events\Subscriber
, je v ve
jmenném prostoru mysys\admin\presenters
a dědí od
MyAppPresenter, které je ve jmenném prostoru mysys\presenters
.
TestPresenter je v config.neon registrován jako posluchač přes
tags: [kdyby.subscriber]
. V config.neon je pak mapování
nastaveno takto: mysys\*\presenters\*Presenter.
V renderDefault() se link vygeneruje korektně, ale problém nastává po
odchycení události onStarted(), kdy systém hodí následující chybu:
Invalid link: Cannot load presenter ‚Test‘, class ‚mysys\presenters\TestPresenter‘ was not found.
Přitom presenter ‚Test‘ je ve jmenném prostoru
mysys\admin\presenters\TestPresenter
, nikoliv
mysys\presenters\TestPresenter
. Ještě pro doplnění, když
např. v onStarted vyhodím flash message nebo jakoukoliv jinou „věc“
presenteru, funguje správně, ale link ne. Nevíte, čím by to mohlo
být? Dík.
Editoval svezij (1. 4. 2016 7:43)