5. Eventy v Nette?
class Circle extends NetteObject
{
public $onChange = [];
public function setRadius($radius)
{
$this->radius = max(0, $radius);
$this->onChange($this, $this->radius);
}
6. Eventy v Nette?
$circle = new Circle;
$circle->onChange[] =
function($circle, $newValue) {
echo 'there was a change!';
};
$circle->setRadius(10);
7. Nette magic
class NetteObject
{
public function __call($name, $args)
{
foreach ($this->{"on$name"} as $cb)
{
call_user_func_array($cb, $args);
}
}
9. Co je problém?
class MyControl extends UIControl {
public function handleFoo() {
// logic
$this->presenter->flashMessage('Yatta!');
$this->redirect('Foo:');
}
}
10. Řešení?
class MyControl extends UIControl {
public $onSuccess = [];
public function handleFoo() {
// logic
$this->onSuccess($this, $arg);
}
}
36. Vraťme se na začátek...
public function __construct(
EntityManager $em,
NetteSecurityUser $user,
NetteHttpSession $session
){
37. … a přidejme si jeden event
class OrderProcess
public $onFinish = [];
function finish(Order $order) {
// ...
$this->onFinish($this, $order);
}
38. … a napíšeme si listenery
class OrderMailerListener
implements Subscriber {
function getSubscribedEvents() {
return [
'OrderProcess::onFinish'
];
}
39. … a napíšeme si listenery
class OrderMailerListener
function __construct(IMailer $mailer);
function onFinish(Order $order) {
// ..
$this->mailer->send($message);
}
40. … a napíšeme si listenery
class CreditsRewardListener
function __construct(
Rewarder $r, User $user);
function onFinish(Order $order) {
$this->rewarder->reward(
$this->user->id,
$order->price * 0.05);
}
41. … a napíšeme si listenery
class SmsSenderListener
function __construct(SmsSender $sender);
function onFinish(Order $order) {
// ..
$this->sender->send($message);
}