Skip to content

malapronta/mplog

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Malapronta Logger behavior

Latest Stable Version Total Downloads

Overview

This is a Doctrine2 behavior extension, based on Gedmo

Install

Add MPLog in your composer.json:

{
    "require": {
        "malapronta/mplog": "dev-master"
    }
}

Using

  1. Configure your doctrine extensions file
# app/config/doctrine_extensions.yml

services:
    malapronta.listener.eventpersist:
        class: Ota\ServiceBundle\Listener\EventPersistListener
        tags:
            - { name: doctrine.event_listener, event: preUpdate }
            - { name: doctrine.event_listener, event: postFlush }

    # KernelRequest listener
    extension.listener:
        class: Ota\ServiceBundle\Listener\DoctrineExtensionListener
        calls:
            - [ setContainer, [ @service_container ] ]
        tags:
            # loggable hooks user username if one is in security context
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

    # Doctrine Extension listeners to handle behaviors
    malapronta.listener.mplog:
        class: Malapronta\MpLog\MpLoggerListener
        tags:
            - { name: doctrine.event_subscriber, connection: default }
        calls:
            - [ setAnnotationReader, [ @annotation_reader ] ]

And import in your config.yml file

imports:
    - { resource: doctrine_extensions.yml }
  1. Configure your Listener class
<?php

// src/Your/NameBundle/Listener/DoctrineExtensionListener.php

namespace Your\NameBundle\Listener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class DoctrineExtensionListener implements ContainerAwareInterface
{
    /**
     * @var ContainerInterface
     */
    protected $container;

    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        $securityContext = $this->container->get('security.context', ContainerInterface::NULL_ON_INVALID_REFERENCE);
        if(null !== $securityContext && null !== $securityContext->getToken() && $securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
            $loggable = $this->container->get('malapronta.listener.mplog');
            $loggable->setUpdatedByUser($securityContext->getToken()->getUser()->getId());
            $loggable->setUpdatedByIp($this->getRemoteAddr());
            $loggable->setUpdatedByType('TYPE_NAME');
        }
    }

    private function getRemoteAddr()
    {
        return isset($_SERVER['REMOTE_ADDR']) ? trim($_SERVER['REMOTE_ADDR']) : '';
    }
}
  1. Configure your Entity class
<?php

// src/Your/NameBundle/Entity/Foo.php

namespace Your\NameBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Malapronta\Mapping\Annotation as Malapronta;

/**
 * @ORM\Entity
 * @ORM\Table(name="foo")
 * @Malapronta\MpLogger
 */
class Foo
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(name="updated_by_user", type="integer")
     */
    private $updatedByUser;

    /**
     * @ORM\Column(name="updated_by_ip", type="string", length=39)
     */
    private $updatedByIp;

    /**
     * @ORM\Column(name="updated_by_type", type="string", length=255)
     */
    private $updatedByType;

    // implement get and set methods
}
  1. Configure your Event Persist Listener
<?php

// src/Your/NameBundle/Entity/Foo.php

namespace Your\NameBundle\Entity;

use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Event\PostFlushEventArgs;

use Ota\ServiceBundle\Entity\InquiryHistory;
use Ota\ServiceBundle\Entity\InquiryHospitality;

/**
 * EventPersistListener class implements doctrine events
 *
 * @package Ota\ServiceBundle\Listener
 * @since   2013-10-03
 */
class EventPersistListener
{
    private $needsFlush;

    /**
     * preUpdate hook
     */
    public function preUpdate(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();
        $entityManager = $args->getEntityManager();
        $fields = array();

        if ($entity instanceof Foo) {
            // do some magic stuff
        }
    }

    /**
     * postFlush hook
     */
    public function postFlush(PostFlushEventArgs $eventArgs)
    {
        if ($this->needsFlush) {
            $this->needsFlush = false;
            $eventArgs->getEntityManager()->flush();
        }
    }
}