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
Requires
- doctrine/common: >=2
- symfony/framework-bundle: >=2.0
- symfony/validator: >=2.0
Requires (Dev)
- beberlei/doctrineextensions: dev-master
- doctrine/mongodb-odm: 1.0.0-BETA8
- doctrine/orm: >=2
- symfony/yaml: >=2.0
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