malapronta / mplog
A Doctrine2 behavior based on Gedmo extensions
v1.0.0
2014-03-07 15:54 UTC
Requires
- php: >=5.3.0
- symfony/framework-bundle: 2.*
This package is not auto-updated.
Last update: 2025-05-05 17:24:01 UTC
README
Overview
This is a Doctrine2 behavior extension, based on Gedmo
Install
Add MPLog in your composer.json:
{ "require": { "malapronta/mplog": "dev-master" } }
Using
- 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 }
- 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']) : ''; } }
- 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 }
- 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(); } } }