PHP code example of hostnet / entity-tracker-component
1. Go to this page and download the library: Download hostnet/entity-tracker-component library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
hostnet / entity-tracker-component example snippets
use Acme\Component\Listener\ChangedAtListener;
use Hostnet\Component\EntityTracker\Listener\EntityChangedListener;
use Hostnet\Component\EntityTracker\Provider\EntityAnnotationMetadataProvider;
use Hostnet\Component\EntityTracker\Provider\EntityMutationMetadataProvider;
/* @var $em \Doctrine\ORM\EntityManager */
$event_manager = $em->getEventManager();
// default doctrine annotation reader
$annotation_reader = new AnnotationReader();
// setup ter the events
$event_manager->addEventListener('preFlush', $entity_changed_listener);
$event_manager->addEventListener('prePersist', $entity_changed_listener);
$event_manager->addEventListener('entityChanged', $listener);
namespace Acme\Component\Listener;
use Hostnet\Component\EntityTracker\Event\EntityChangedEvent;
class ChangedAtListener
{
private $now;
public function __construct(\DateTime $now)
{
$this->now = $now;
}
public function entityChanged(EntityChangedEvent $event)
{
if (!($entity = $event->getCurrentEntity()) instanceof UpdatableInterface) {
// uses the tracked but might not have our method
return;
}
$entity->setUpdatedAt($this->now);
}
}
namespace Acme\Component\Listener;
interface UpdatableInterface
{
public function setUpdatedAt(\DateTime $now);
}
use Acme\Component\Listener\UpdatableInterface;
use Doctrine\ORM\Mapping as ORM;
use Hostnet\Component\EntityTracker\Annotation\Tracked;
/**
* @ORM\Entity
* @Tracked
*/
class MyEntity implements UpdatableInterface
{
/**
* @ORM\...
*/
private $changed_at;
public function setUpdatedAt(\DateTime $now)
{
$this->changed_at = $now;
}
}
$entity->setName('henk');
$em->flush();
// Voila, your changed_at is filled in
use Hostnet\Component\EntityTracker\Annotation\Tracked;
/**
* @Annotation
* @Target({"CLASS"})
*/
class Changed extends Tracked
{
public $ignore_fields = [];
public function getIgnoredFields()
{
if (empty($this->ignore_fields)) {
return ['id'];
}
return $ignore_fields;
}
}
use Doctrine\ORM\EntityManagerInterface;
use Hostnet\Component\EntityTracker\Provider\EntityAnnotationMetadataProvider;
class ChangedResolver
{
private $annotation = 'Changed';
private $provider;
public function __construct(EntityAnnotationMetadataProvider $provider)
{
$this->provider = $provider;
}
public function getChangedAnnotation(EntityManagerInterface $em, $entity)
{
return $this->provider->getAnnotationFromEntity($em, $entity, $this->annotation);
}
}
use Hostnet\Component\EntityTracker\Event\EntityChangedEvent;
class ChangedListener
{
private $resolver;
public function __construct(ChangedResolver $resolver)
{
$this->resolver = $resolver;
}
public function entityChanged(EntityChangedEvent $event)
{
$em = $event->getEntityManager();
$entity = $event->getCurrentEntity();
if (null === ($annotation = $this->resolver->getChangedAnnotation($em, $entity))) {
return;
}
$preferred_changes = array_diff($annotation->getIgnoredFields(), $event->getMutatedFields());
// do something with them
}
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.