Implementation of a directed Graph for establishing connections between objects
PHP
Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
DependencyInjection
Document
Entity
Event
Exception
Listener
Manager
Model
Repository
Resources
Tests
.gitignore
.travis.yml
KitanoConnectionBundle.php
README.md
composer.json
phpunit.xml.dist

README.md

ConnectionBundle Build Status

State : Working. Unstable.

Implementation of a directed Graph for establishing connections between objects.

For instance, a connection may represent:

  • follower/following relationship between two users on a social network
  • an user "following" a "tag"
  • in fact, any relation between any root objects which need to be connected for any reason ;-)

The purpose of this bundle is not to get a ready-to-use implementation but at the minimum a code base to ease the integration of such a system in a Symfony 2 application.

Use case

<?php
namespace Acme\DemoBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class HomeController extends Controller {

    public function indexAction() 
    {
        $connectionManager = $this->get("kitano_connection.manager.connection");

        $userA = $userRepository->find(1);
        $userB = $bookRepository->find(42);

        // User A wants to "follow" User B activity
        // User A clics "follow" button on User B profile page
        $connectionManager->connect($userA, $userB, 'follow');
    }

    public function newPostAction() 
    {
        $connectionManager = $this->get("kitano_connection.manager.connection");

        $userA = $userRepository->find(1);

        // User B does something like creating a new Post
        // We notify all users connected to B
        $connections = $connectionManager->getConnectionsFrom($userB, array('type' => 'follow'));

        foreach($connections as $connection) {
            // Notify !
        }
    }
}

Configuration

a) Short functional example

A simple configuration could be something like that

kitano_connection:
    persistence:
        type: doctrine_orm

Using this configuration, you can use KitanoConnectionBundle as the Use Case example.

After configuration, don't forget to update your RDBMS schema

$ php app/console doctrine:schema:update

b) Custom connection

If you want a custom connection entity.

kitano_connection:
    persistence:
        type: doctrine_orm
        managed_class: "Acme\Entity\Connection"

In this case, don't forget to define an entity schema for Acme\Entity\Connection

c) Custom connection with a custom persistance layer

If you want to use a custom repository, use the above configuration.

kitano_connection:
    persistence:
        type: custom
        managed_class: "Acme\Entity\Connection"

Define a service named : kitano_connection.repository.connection which implement Kitano\ConnectionBundle\Repository\ConnectionRepositoryInterface

Events

Events are availble if you want to hook the system.

namespace Acme\DemoBundle\Event;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;

use Kitano\ConnectionBundle\Event\ConnectionEvent;

class ConnectionSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array(
            ConnectionEvent::CONNECTED => array('onConnected', 0),
            ConnectionEvent::DISCONNECTED => array('onDisconnected', 0),
        );
    }

    public function onConnected(ConnectionEvent $event)
    {
        $connection = $event->getConnection();
        // ...
    }

    public function onDisconnected(ConnectionEvent $event)
    {
        $connection = $event->getConnection();
        // ...
    }
}
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
    <parameters>
        <parameter key="acme.demo.connection_subscriber.class">Acme\DemoBundle\Event\ConnectionSubscriber</parameter>
    </parameters>

    <services>
        <!-- listener -->
        <service id="acme.demo.connection_subscriber" class="%acme.demo.connection_subscriber.class%" public="false">
            <tag name="kernel.event_subscriber" />
        </service>
    </services>
</container>

Limitations

  • This bundle can deal with only one persistance layer. It means that you can't Connect a Document object with an Entity object.

License

This bundle is under the MIT license. See the complete license in the bundle:

Resources/meta/LICENSE

Testing

Require PHPUnit, phpunit/DbUnit

$ php composer.phar update --dev
$ phpunit