undf/connection-bundle

Directed graph implementation to create any connection between two objects (ie. follower/following relation in a social network)

Installs: 459

Dependents: 0

Suggesters: 0

Security: 0

Stars: 2

Watchers: 3

Forks: 6

Type:symfony-bundle

dev-undf 2014-07-04 14:39 UTC

This package is not auto-updated.

Last update: 2024-11-09 13:43:39 UTC


README

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