Skip to content

GlobalTradingTechnologies/doctrine-auditable-bundle

Repository files navigation

Doctrine Auditable Bundle helps tracking changes and history of objects

Auditable behavioral implementation helps tracking changes and history of objects. Fast and lightweight alternative for DoctrineExtensions Loggable with some features. Supports only ORM.

Features

  • Group of changes
  • Comments for changes
  • Convenient store (tracked values before and after change stored in the separated columns, instead serialized entity data in the Loggable)
  • Supports custom DBAL types
  • Supports class inheritance configuration

Installation

  1. Install bundle
composer require "gtt/doctrine-auditable-bundle"
  1. Add to Kernel.php
public function registerBundles()
{
    $bundles = array(
        ...
        new Gtt\Bundle\DoctrineAuditableBundle\DoctrineAuditableBundle(),
    );
    ...
}
  1. Create tables for changes storing
bin/console doctrine:schema:update --force
  1. Configure mapping if needed.

Usage

Add attributes for tracking property

<?php

use Gtt\Bundle\DoctrineAuditableBundle\Mapping\Annotation as Auditable;

/**
 * My entity
 */
 #[ORM\Entity]
 #[ORM\Table(name: 'entity')]
 #[Auditable\Entity]
class Entity
{
     #[ORM\Column(name: 'assigned_user', type: 'string', length: 255)]
     #[Auditable\Property]
    protected string $assignedUser;
    
    ...
}

Then somewhere in a service change an entity property and flush the changes.

<?php

use Doctrine\ORM\EntityManagerInterface;
use Gtt\Bundle\DoctrineAuditableBundle as Auditable;

class PayloadService {
    private Auditable\Log\Store $auditable;
    
    private EntityManagerInterface $entityManager;

    /**
     * Operate!
     */
    public function payloadMethod(YourDomain\Entity $entity): void 
    {
        // 1. change some property that supposed to be logged to changelog
        $entity->updateProperty();  // ... just dummy example
        
        // 2. describe this change
        $this->auditable->describe($entity, 'Change description');
      
        // 3. perform update 
        $this->entityManager->flush();
    }
}