subcosm/observatory

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# observatory
General Observation Pattern Component

[![Build Status](https://travis-ci.org/subcosm/observatory.svg?branch=master)](https://travis-ci.org/subcosm/observatory)
[![codecov](https://codecov.io/gh/subcosm/observatory/branch/master/graph/badge.svg)](https://codecov.io/gh/subcosm/observatory)
[![SensioLabsInsight](https://insight.sensiolabs.com/projects/c48dee80-c812-4ef0-8426-164ac8c2dbb3/mini.png)](https://insight.sensiolabs.com/projects/c48dee80-c812-4ef0-8426-164ac8c2dbb3)
[![Code Climate](https://codeclimate.com/github/subcosm/observatory.png)](https://codeclimate.com/github/subcosm/observatory)
[![Gittip](http://img.shields.io/gittip/subcosm.svg)](https://gittip.com/subcosm/)

### What is observatory?

Observatory is a general interface orchestration for observable
objects using a container for data transport. It's inspired by
the `SplObserver` implementation of [PHP](https://php.net).

### What is the goal of observatory?

Providing an easy to use, easy to understand, lightweight 
event hub to specific implementations without provided 
methods for each event invoker registration.

### How to use it?

Subcosm Observatory is available at [Packagist](https://packagist/subcosm/observatory):

```cli
# composer require subcosm/observatory ~1.0
```

#### Creating the Observable Object

```php
use Subcosm\Observable\{
    ObservableInterface,
    ObservableTrait,
    AbstractObservationContainer as Container
};

class Foo implements ObservableInterface {
    use ObservableTrait;
    
    public function firstAction()
    {
        $message = 'Hello from firstAction!';
    
        $container = new class($this, __METHOD__, $message) extends Container {
            
            protected $message;
            
            public function __construct($object, string $stage, string $message) 
            {
                $this->message = $message;
                
                parent::__construct($object, $stage);
            }
            
            public function getMessage()
            {
                $this->message;
            }
        };
        
        $this->notify($container);
    }
    
    public function secondAction()
    {
        $message = 'Another hello from secondAction!';
            
        $container = new class($this, __METHOD__, $message) extends Container {
            
            protected $message;
            
            public function __construct($object, string $stage, string $message) 
            {
                $this->message = $message;
                
                parent::__construct($object, $stage);
            }
            
            public function getMessage()
            {
                $this->message;
            }
        };
        
        $this->notify($container);
    }
}
```

#### Creating an Observer

```php
use Subcosm\Observable\{
    ObserverInterface,
    ObservationContainerInterface as Container
};

class EchoMessageObserver implements ObserverInterface {
    
    public function update(Container $container)
    {
        echo $container->getMessage().PHP_EOL;
    }
    
}
```

#### Using the Observable and Observer

```php
$observable = new Foo;

$observer = new EchoMessageObserver;

$observable->attach($observer);

$observable->firstAction();
$observable->secondAction();
```

Results in:

```cli
Hello from firstAction!
Another hello from secondAction!

```

### Package Stability and Maintainers

This package is considered stable. The maintainers of this package are:

- [Matthias Kaschubowski](https://github.com/nhlm)

### License

This package is licensed under the [MIT-License](LICENSE).