Nefunkcni Kdyby events (nezavola se listener)
- 41095
- Člen | 6
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)
- 41095
- Člen | 6
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
Na entitách nemůžeš mít kdyby/events události, protože entity nejsou služby.
- Tomáš Votruba
- Moderator | 1114
Myslím, že můžeš použít Doctrine eventy: http://doctrine-orm.readthedocs.org/…/events.html
- David Matějka
- Moderator | 6445
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
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)
- Jan Endel
- Člen | 1016
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
@o5 Ano, pokud si presentery zaregistruješ jako služby, ale lepší je mít eventy ve službách nebo ve facades.