Invalid link: Cannot load presenter – špatný namespace po odchycení události

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
svezij
Člen | 69
+
0
-

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)