Nefunkcni Kdyby events (nezavola se listener)

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

Zdravim Vas,

mam podobny problem jako byl resen zde
ale na prvni pohled se mi zda vse OK.

fungovat by to melo takto:

  • v presenteru si vytvorim new Article, predam mu komentare a zavolam metodu udelejNeco(), ktera provede nejake operace a nasledne by se mela zavolat udalost onSuccess. ocekaval bych tedy, ze kod nize vypise na stranku text „bla bla“, to se ovsem nestane. na stranku se nevypise nic :( Dlema nekde chybu?

vyjmu z kodu jen to nejdulezitejsi:

config.neon

extensions:
	events: Kdyby\Events\DI\EventsExtension

events:
	subscribers:
		- ArticleListener

trida Article

class Article extends Nette\Object
{
    public $onSuccess = array();

    private $comments;

    public function __construct(Comments $comments)
    {
        $this->comments = $comments;
    }

    public function udelejNeco()
    {
		// nejaka logika
        $this->onSuccess($this);
    }
}

Presenter:

class HomepagePresenter extends BasePresenter
{

	public function renderDefault()
	{
		$comments = new Comments();
		$article = new Article($comments);
		$article->udelejNeco();
	}

}

ArticleListener

class ArticleListener extends Nette\Object implements Kdyby\Events\Subscriber
{
    public function onSuccess(Article $article)
    {
        // nejaky kod....
        echo 'bla bla';
    }

    public function getSubscribedEvents()
    {
        return array('Article::onSuccess' => 'onSuccess');
    }
}

a jeste screenshot z debug panelu:
http://awesomescreenshot.com/0383rbz3ea

mam nekde chybu? dekuju za rady

Editoval 41095 (30. 10. 2014 20:21)

Marek Šneberger
Člen | 130
+
0
-

Máš tu třídu Article zaregistrovanou v DI kontejneru?

41095
Člen | 6
+
0
-

jezisi kriste… omlouvam se, vzdyt to je na prvni pohled jasne kde je chyba…

registrovanou ji mam, ale v presenteru to musi vypadat nejak takto:

class HomepagePresenter extends BasePresenter
{
	/** @var Article @inject */
	public $article;

    public function renderDefault()
    {
        $comments = new Comments();
        $article = $this->article;
        $article->udelejNeco();
    }

}

a pak uz to funguje

Filip Procházka
Moderator | 4668
+
+3
-

Na entitách nemůžeš mít kdyby/events události, protože entity nejsou služby.

Azathoth
Člen | 495
+
0
-

A co doporučuješ, pokud chci něco navěšet na entity?

Tomáš Votruba
Moderator | 1114
+
0
-

Myslím, že můžeš použít Doctrine eventy: http://doctrine-orm.readthedocs.org/…/events.html

David Matějka
Moderator | 6445
+
+1
-

hackujeme kdyby/events #drunktýt

		$builder->addDefinition($this->prefix('fooFactory'))
		        ->setImplement(App\Foo\BarFactory::class)
		        ->addSetup('$this->getService(?)->?(?)', ['events.manager', 'addEventSubscriber', '@self']);
David Matějka
Moderator | 6445
+
0
-

a co to kurva dela?

po vytvoreni instance pres onu factory bude ona instance naslouchat na vsechny udalosti

#drunktýt zítra to mozna zedituju a napíču to sromutelnějc.

stejne tak mohou entity emitovat udalosti…

jo ted na to koukam trochu za strizliva… ty chces z entit vyvolavat udalosti co? pak staci, kdyz mas na entituy generovanou tovarnicku (a kvuli bugu musis specifikovat krom interfface i tridu) #drunktýt

Editoval matej21 (1. 11. 2014 4:31)

o5
Člen | 416
+
0
-

@FilipProcházka: Lze nějak použít kdyby/events v presenterech?

Jan Endel
Člen | 1016
+
0
-

A není hezčí a čistější než znásilňovat entitu do service nák takto:

HomepagePresenter:

class HomepagePresenter extends BasePresenter
{
    /**
	 * @var ArticleRepository
	 * @inject
	*/
    public $articleRepository;



    public function renderDefault($articleId)
    {
        $comments = new Comments();
        $this->articleRepository->addComments($articleId, $comments);
    }

}

ArticleRepository:

/**
 * @method onCommentsAdd(ArticleRepository $articleRepository, Article $article, Commennts $comments)
 */
class ArticleRepository extends Nette\Object
{
	/**
	 *	@var \Kdyby\Doctrine\EntityDao
	 */
	private $articleDao;

	public $onCommentsAdd = [];

	public function __construct(\Kdyby\Doctrine\EntityManager $entityManager)
	{
		$this->articleDao = $entityManager->getDao(Article::class);
	}

	public function addComments($articleId, $comments)
	{
		$article = $this->articleDao->find($articleId);
		$article->addComments($comments);

		$this->onCommentsAdd($this, $article, $commnents);
	}
}

Listener:

class AddComentsListener extends Nette\Object implements Subscriber
{
    public function getSubscribedEvents()
    {
        return array('ArticleRepository::onCommentsAdd' => 'sendNotification');
    }

	public function sendNotification(ArticleRepository $articleRepository, Article $article, Comments $comments)
	{
		// ...
	}
}
Filip Procházka
Moderator | 4668
+
0
-

@o5 Ano, pokud si presentery zaregistruješ jako služby, ale lepší je mít eventy ve službách nebo ve facades.

o5
Člen | 416
+
0
-

@FilipProcházka: Díky za info.