phoole/event

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# event
[![Build Status](https://travis-ci.com/phoole/event.svg?branch=master)](https://travis-ci.com/phoole/event)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/phoole/event/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/phoole/event/?branch=master)
[![Code Climate](https://codeclimate.com/github/phoole/event/badges/gpa.svg)](https://codeclimate.com/github/phoole/event)
[![PHP 7](https://img.shields.io/packagist/php-v/phoole/event)](https://packagist.org/packages/phoole/event)
[![Latest Stable Version](https://img.shields.io/github/v/release/phoole/event)](https://packagist.org/packages/phoole/event)
[![License](https://img.shields.io/github/license/phoole/event)]()

Slim, powerful and full compatible PSR-14 event manager library for PHP.

Installation
---
Install via the `composer` utility.

```
composer require "phoole/event"
```

or add the following lines to your `composer.json`

```json
{
    "require": {
       "phoole/event": "1.*"
    }
}
```

Features
---

- Full PSR-14 support

- Support for classes want event-triggering capability with `EventCapableTrait` 

- Support for classes want event-listening capability with `ListenerCapableTrait`

Usage
---

- <a name="start"></a>Quick start

  ```php
  use Phoole\Event\Provider;
  use Phoole\Event\Dispatcher;
  use Phoole\Event\Events\StoppableEvent;
  
  // create your own event class
  class MyEvent extends StoppableEvent {
  }
  
  // an invokable class for event handling
  class MyEventHandler
  {
      public function __invoke(MyEvent $event)
      {
           echo 'handling event...';
           return $event; // optional
      }
  } 
  
  // initiate event dispatcher
  $events = new Dispatcher(new Provider());

  // bind a callable with default priority 50 (0-100)
  $provider->attach(function(myEvent $event) {
      echo 'triggered...';
      return $event; // optional
  });
  
  // bind a invokable object with priority 80
  $provider->attach(new MyEventHandler(), 80);

  // fire the trigger, wil see output 'handling event...triggered...'
  $events->dispatch(new MyEvent());
  ```

- <a name="hierarchy"></a>Event hierarchy

  Instead of using event name to trigger like many event libraries were doing.
  PSR-14 compliant event libraries now only support triggering with event object. 
  By setting up a meaningful event object hierarchy, developers may achieve great
  flexibility in event handling.
  
  Listeners will **ONLY** handle the events (and their subclasses) configured 
  with the event parameter. 
  
  ```php
  use Phoole\Event\Events\StoppableEvent;
  
  // my own event hierarchy top
  class MyEvent extends StoppableEvent
  {
  }
  
  // my user authentication event
  class MyAuthEvent extends MyEvent
  {
      protected $userInfo;
  
      public function __construct(array $userInfo)
      {
          $this->userInfo = $userInfo;
      }
  
      public function getUserInfo(): array
      {
          return $this->userInfo;
      }
  }
  
  $provider = new Provider();
  $events = new Dispatcher($provider);
  
  // attach a listener to the event hierarchy top
  $provider->attach(function(MyEvent $event) {
      echo 'Event '.get_class($event).' fired';
      return $event; // optional
  });
  
  // attach a listener for logging users
  $provider->attach(function(MyAuthEvent $event)) use ($logger) {
      $logger->info(sprintf("User '%s' logged", $event->getUserInfo()['name']));
      return $event; // optional
  });
  
  ...

  // upon user logged in, trigger the event
  // BOTH listeners will process THIS event
  $events->dispatcher(new MyAuthEvent($userInfo));
  ```
  
- <a name="listener"></a>Create a **listener class**

  A listener class may implement the `ListenerCapableInterface` and use
  `ListenerCapableTrait`.

  ```php
  use Phoole\Event\ListenerCapableTrait;
  use Phoole\Event\ListenerCapableInterface;

  // my listener class
  class MyListener implements ListenerCapableInterface
  {
      use ListenerCapableTrait;
  
      // define on listener method
      public function MethodOne(MyEvent $event)
      {
           echo 'handling MyEvent in MethodOne...';
      }
      
      // define another listener method
      public function MethodTwo(MyEvent $event)
      {
          echo 'handling MyEvent in MethodTwo...';
      }
  
      // config this listener
      protected function eventsListening()
      {
          return [
              'MethodOne',
              ['MethodTwo', 80] // with priority 80
          ];
      }
  }
  
  // global dispatcher & provider
  $provider = new Provider();
  $events = new Dispatcher($provider);
  
  // set provider is enough
  $listener = new MyListener();
  $listener->setProvider($provider);
  
  // fire the event
  $events->dispatch(new MyEvent());
  ```
  
  Along with container library `phoole/di`, developer may not event worry
  about setting up dispatcher, provider or injecting the provider.
  
  ```php
  use Phoole\Di\Container;
  
  // initiate the listener with dependencies injected
  $listener = Container::create(MyListener::class);
  
  // fire the event
  Container::events()->dispatch(new MyEvent());
  ```

- <a name="eventcapable"></a>Triggering events in your classes

  `EventCapableInterface` and `EventCapableTrait` give developers the ability
  of triggering events in their classes.

  ```php
  use Phoole\Event\EventCapableTrait;
  use Phoole\Event\EventCapableInterface;
  
  class MyEventCapable implements EventCapableInterface
  {
      use EventCapableTrait;
  
      public function myMethod()
      {
           $this->triggerEvent(new MyEvent());
      }
  }
  
  // global dispatcher & provider
  $provider = new Provider();
  $events = new Dispatcher($provider);
  
  $eventCapable = new MyEventCapable();
  $eventCapable->setDispatcher($dispatcher);
  
  // will trigger an event
  $eventCapable->myMethod();
  ```
  
  Along with container library `phoole/di`, developer may not event worry
  about setting up dispatcher, provider or injecting the dispatcher.
  
  ```php
  // initiate object with dependencies injected
  $eventCapable = Container::create(MyEventCapable::class);
  
  // will trigger an event
  $eventCapable->myMethod();
  ```

Testing
---

```bash
$ composer test
```

Dependencies
---

- PHP >= 7.2.0

- Phoole/base 1.*

License
---

- [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0)