Formatter and Handler Database - Writing and reading entity changes Fetching Entity logs
Friday, September 15, 2017 6:40 PM Edit on GitHubFetching entity logs
Fetch EntityLogs from a repository
Use the \Watcher\Repository\EntityLogRepository
(or extend it). This Repository provides the method getLogsFromEntity()
:
$userRepository = $em->getRepository(User::class);
$user = $userRepository->find(42);
/** @var $logRepository EntityLogRepository */
$logRepository = $em->getRepository(EntityLog::class);
/** @var $logs EntityLog[] */
$logs = $logRepository->getLogsFromEntity($user);
printf("Latest change: %s.", $logs[0]->getChangedAt()->format('Y-m-d H:i:s'));
Fetch EntityLogs from entity
You can also inject the logs from to the related entity itself. To achieve this, a few steps are needed:
Register the LoadListener
When creating the event manager, let the \Watcher\EventListener\LoadListener
listen to the Event::postLoad
event:
// ...
$eventManager->addEventListener(array(Events::onFlush), $listener);
// ...
$eventManager->addEventListener(array(Events::postLoad), new LoadListener());
Assign the LogAccessor interface
Your entity must follow the \Watcher\Entity\LogAccessor
interface to ensure that the LoadListener can inject the changes:
/**
* User Entity
* @ORM\Entity
* @ORM\Table(name="example_users")
*/
class User implements LogAccessor {
// ...
}
The LogAccessor interface does look like this:
interface LogAccessor extends WatchedEntity
{
/**
* @return EntityLog[]
*/
public function getLogs();
/**
* @param EntityLog[] $logs
*/
public function setLogs($logs);
}
As you can the, the interface does already implement the WatchedEntity
interface, so there is no need to implement both.
Fortunately, this package already provides a \Watcher\Enity\LogAccessorTrait
, so there is no more configuration needed (You must implement the LogAccessor since PHP does not supports interface implementations on traits).
From now, you can fetch entites without an EnityLogRepository:
$userRepository = $em->getRepository(User::class);
$user = $userRepository->find(42);
$logs = $user->getLogs();
printf("Latest change: %s (%d changes total).", $logs[0]->getChangedAt()->format('Y-m-d H:i:s'), count($logs);