Skip to content

Commit

Permalink
Event Dispatcher example (#10)
Browse files Browse the repository at this point in the history
* Event Dispatcher

* Event Disptacher

* Event Dispatcher

* Event Dispatcher
  • Loading branch information
mabar authored and f3l1x committed Apr 19, 2019
1 parent dbba578 commit 512e52a
Show file tree
Hide file tree
Showing 18 changed files with 2,079 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Expand Up @@ -12,6 +12,7 @@
| [ApiRouter](https://github.com/contributte/playground/tree/master/api-router) | api-router | Starter project for ApiRouter. |
| [Console + Console Extra](https://github.com/contributte/playground/tree/master/console-extra) | console,console-extra | Example of Console Extra with all commands. |
| [Datagrid](https://github.com/contributte/playground/tree/master/datagrid) | datagrid | Dockerized example od our datagrid. |
| [Event Dispatcher](https://github.com/contributte/playground/tree/master/event-dispatcher) | event-dispatcher, event-dispatcher-extra | Example of dispatching and subscribing events. |

## Maintainers

Expand Down
1 change: 1 addition & 0 deletions event-dispatcher/.gitignore
@@ -0,0 +1 @@
vendor
5 changes: 5 additions & 0 deletions event-dispatcher/.htaccess
@@ -0,0 +1,5 @@
# Redirect request to www folder
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ www/$1 [ns,L,QSA]
</IfModule>
17 changes: 17 additions & 0 deletions event-dispatcher/README.md
@@ -0,0 +1,17 @@
# Event Dispatcher + Event Dispatcher Extra

This is example of symfony/event-dispatcher for Nette Framework.

## Installation

```
git pull git@github.com:contributte/playground.git
cd event-dispatcher
composer install
```

## See

- app/Presenters/HomepagePresenter - dispatching events
- app/Events/ExampleSubscriber - subscribing events
- app/Events/ExampleEvent - creating events
25 changes: 25 additions & 0 deletions event-dispatcher/app/Events/ExampleEvent.php
@@ -0,0 +1,25 @@
<?php declare(strict_types = 1);

namespace App\Events;

use Symfony\Component\EventDispatcher\Event;

class ExampleEvent extends Event
{

public const NAME = 'app.events.exampleEvent';

/** @var string */
private $example;

public function __construct(string $example)
{
$this->example = $example;
}

public function getExample(): string
{
return $this->example;
}

}
57 changes: 57 additions & 0 deletions event-dispatcher/app/Events/ExampleSubscriber.php
@@ -0,0 +1,57 @@
<?php declare(strict_types = 1);

namespace App\Events;

use Contributte\Events\Extra\Event\Application\ApplicationEvents;
use Contributte\Events\Extra\Event\Application\PresenterEvent;
use Contributte\Events\Extra\Event\Application\PresenterShutdownEvent;
use Contributte\Events\Extra\Event\Application\PresenterStartupEvent;
use Contributte\Events\Extra\Event\Application\RequestEvent;
use Contributte\Events\Extra\Event\Application\ResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class ExampleSubscriber implements EventSubscriberInterface
{

public static function getSubscribedEvents(): array
{
return [
ExampleEvent::NAME => 'example',
ApplicationEvents::ON_PRESENTER => 'presenter',
ApplicationEvents::ON_PRESENTER_STARTUP => 'presenterStartup',
ApplicationEvents::ON_PRESENTER_SHUTDOWN => 'presenterShutdown',
ApplicationEvents::ON_REQUEST => 'request',
ApplicationEvents::ON_RESPONSE => 'response',
];
}

public function example(ExampleEvent $event): void
{
bdump($event->getExample(), 'Example');
}

public function presenter(PresenterEvent $event): void
{
bdump($event->getPresenter(), 'Presenter');
}

public function presenterStartup(PresenterStartupEvent $event): void
{
bdump($event->getPresenter(), 'Presenter startup');
}

public function presenterShutdown(PresenterShutdownEvent $event): void
{
bdump($event->getPresenter(), 'Presenter shutdown');
}

public function request(RequestEvent $event): void
{
bdump($event->getRequest(), 'Request');
}

public function response(ResponseEvent $event): void
{
bdump($event->getResponse(), 'Response');
}
}
26 changes: 26 additions & 0 deletions event-dispatcher/app/Presenters/HomepagePresenter.php
@@ -0,0 +1,26 @@
<?php declare(strict_types = 1);

namespace App\Presenters;

use App\Events\ExampleEvent;
use Nette\Application\UI\Presenter;
use Symfony\Component\EventDispatcher\EventDispatcher;

class HomepagePresenter extends Presenter
{

/** @var EventDispatcher */
private $dispatcher;

public function __construct(EventDispatcher $dispatcher)
{
parent::__construct();
$this->dispatcher = $dispatcher;
}

public function actionDefault(): void
{
$this->dispatcher->dispatch(ExampleEvent::NAME, new ExampleEvent('example'));
}

}
19 changes: 19 additions & 0 deletions event-dispatcher/app/Presenters/templates/@layout.latte
@@ -0,0 +1,19 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">

<title>{ifset title}{include title|stripHtml} | {/ifset}Nette Web</title>
</head>

<body>
<div n:foreach="$flashes as $flash" n:class="flash, $flash->type">{$flash->message}</div>

{include content}

{block scripts}
<script src="https://nette.github.io/resources/js/netteForms.min.js"></script>
{/block}
</body>
</html>
38 changes: 38 additions & 0 deletions event-dispatcher/app/Presenters/templates/Homepage/default.latte
@@ -0,0 +1,38 @@
{* This is the welcome page, you can delete it *}

{block content}
<div id="banner">
<h1 n:block=title>Congratulations!</h1>
</div>

<div id="content">
<h2>You have successfully created your <a href="https://nette.org">Nette</a> Web project.</h2>

<p><img src="data:image/png;base64,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" alt="">
If you are exploring Nette for the first time, you should read the
<a href="https://doc.nette.org/quickstart">Quick Start</a>, <a href="https://doc.nette.org">documentation</a>,
<a href="https://pla.nette.org">tutorials</a> and <a href="https://forum.nette.org">forum</a>.</p>

<h2>We hope you enjoy Nette!</h2>
</div>

<style>
html { font: normal 18px/1.3 Georgia, "New York CE", utopia, serif; color: #666; -webkit-text-stroke: 1px rgba(0,0,0,0); overflow-y: scroll; }
body { background: #3484d2; color: #333; margin: 2em auto; padding: 0 .5em; max-width: 600px; min-width: 320px; }
a { color: #006aeb; padding: 3px 1px; }
a:hover, a:active, a:focus { background-color: #006aeb; text-decoration: none; color: white; }
#banner { border-radius: 12px 12px 0 0; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAB5CAMAAADPursXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAGBQTFRFD1CRDkqFDTlmDkF1D06NDT1tDTNZDk2KEFWaDTZgDkiCDTtpDT5wDkZ/DTBVEFacEFOWD1KUDTRcDTFWDkV9DkR7DkN4DkByDTVeDC9TDThjDTxrDkeADkuIDTRbDC9SbsUaggAAAEdJREFUeNqkwYURgAAQA7DH3d3335LSKyxAYpf9vWCpnYbf01qcOdFVXc14w4BznNTjkQfsscAdU3b4wIh9fDVYc4zV8xZgAAYaCMI6vPgLAAAAAElFTkSuQmCC); }
h1 { font: inherit; color: white; font-size: 50px; line-height: 121px; margin: 0; padding-left: 4%; background: url(https://files.nette.org/images/logo-nette@2.png) no-repeat 95%; background-size: 130px auto; text-shadow: 1px 1px 0 rgba(0, 0, 0, .9); }
@media (max-width: 600px) {
h1 { background: none; font-size: 40px; }
}
#content { background: white; border: 1px solid #eff4f7; border-radius: 0 0 12px 12px; padding: 10px 4%; overflow: hidden; }
h2 { font: inherit; padding: 1.2em 0; margin: 0; }
img { border: none; float: right; margin: 0 0 1em 3em; }
</style>
20 changes: 20 additions & 0 deletions event-dispatcher/app/Router/RouterFactory.php
@@ -0,0 +1,20 @@
<?php declare(strict_types = 1);

namespace App\Router;

use Nette\Application\IRouter;
use Nette\Application\Routers\Route;
use Nette\Application\Routers\RouteList;
use Nette\StaticClass;

class RouterFactory
{
use StaticClass;

public static function createRouter(): IRouter
{
$router = new RouteList;
$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
return $router;
}
}
19 changes: 19 additions & 0 deletions event-dispatcher/app/bootstrap.php
@@ -0,0 +1,19 @@
<?php declare(strict_types = 1);

use Contributte\Bootstrap\ExtraConfigurator;

require __DIR__ . '/../vendor/autoload.php';

$configurator = new ExtraConfigurator();

//$configurator->setDebugMode('23.75.345.200'); // enable for your remote IP
$configurator->enableTracy(__DIR__ . '/../log');

$configurator->setTimeZone('Europe/Prague');
$configurator->setTempDirectory(__DIR__ . '/../temp');

$configurator->addConfig(__DIR__ . '/config/config.neon');

$container = $configurator->createContainer();

return $container;
12 changes: 12 additions & 0 deletions event-dispatcher/app/config/config.neon
@@ -0,0 +1,12 @@
application:
mapping:
*: App\*Module\Presenters\*Presenter

services:
router: App\Router\RouterFactory::createRouter
- App\Events\ExampleSubscriber

extensions:
events: Contributte\EventDispatcher\DI\EventDispatcherExtension
events.application: Contributte\Events\Extra\DI\EventApplicationBridgeExtension
events.security: Contributte\Events\Extra\DI\EventSecurityBridgeExtension
22 changes: 22 additions & 0 deletions event-dispatcher/composer.json
@@ -0,0 +1,22 @@
{
"require": {
"php": ">= 7.1",
"contributte/application": "^0.3.1",
"contributte/bootstrap": "^0.3.1",
"contributte/cache": "^0.2.0",
"contributte/di": "^0.3.0",
"contributte/event-dispatcher": "^0.4",
"contributte/event-dispatcher-extra": "^0.4.1",
"contributte/http": "^0.2.0",
"contributte/security": "^0.2.0",
"contributte/utils": "^0.2.0",
"contributte/latte": "^0.3.0",
"contributte/tracy": "^0.3.1",
"nette/robot-loader": "^3.0.4"
},
"autoload": {
"psr-4": {
"App\\": "app"
}
}
}

0 comments on commit 512e52a

Please sign in to comment.