1. Go to this page and download the library: Download bentools/doctrine-changeset 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/ */
namespace App\Services;
use App\Entity\Book;
use BenTools\DoctrineChangeSet\Tracker\EntityTracker;
use Doctrine\ORM\EntityManagerInterface;
use function assert;
use function BenTools\DoctrineChangeSet\Tracker\oneOf;
use function BenTools\DoctrineChangeSet\Tracker\whatever;
final readonly class MyService {
public function __construct(
private EntityTracker $tracker,
private EntityManagerInterface $em,
) {}
public function createBook(): void
{
$book = new Book();
$book->title = 'PHP For Dummiez';
$book->isbn = '00000000001';
assert(true === $this->tracker->hasChanged($book));
$this->em->persist($book);
$this->em->flush();
}
public function updateBook(): void
{
$repository = $this->em->getRepository(Book::class)
$book = $repository->findOneBy(['isbn' => '00000000001']);
$book->title = 'PHP For Dummies';
assert(true === $this->tracker->hasChanged($book));
assert(true === $this->tracker->hasChanged($book, 'title'));
assert(false === $this->tracker->hasChanged($book, 'isbn'));
assert(true === $this->tracker->getChangeSet($book, 'title')->hadPreviousValue('PHP For Dummiez'));
assert(true === $this->tracker->getChangeSet($book, 'title')->hasNewValue('PHP For Dummies'));
// Shorthand for both methods above
assert(true === $this->tracker->getChangeSet($book, 'title')->hasChangedFor('PHP For Dummiez', 'PHP For Dummies'));
// You can also check for multiple values
assert(true === $this->tracker->getChangeSet($book, 'title')->hadPreviousValue(oneOf('PHP For Dummies', 'PHP For Dummiez')));
assert(true === $this->tracker->getChangeSet($book, 'title')->hasNewValue(whatever()->except(null, 'PHP For Dummiez')));
$this->em->flush();
}
}
namespace App\Entity;
use DateTimeImmutable;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\DBAL\Types\Types;
#[ORM\Entity]
class Book
{
#[ORM\Id, ORM\Column, ORM\GeneratedValue]
public int $id;
#[ORM\Column]
public string $title;
#[ORM\Column(type: Types::OBJECT)]
public object $data;
}
$book = $repository->findOneBy([])
$book->data->foo = 'bar'
$em->flush(); // Will have no effect as soon as no other scalar or array property has been changed
namespace App\Entity;
use BenTools\DoctrineChangeSet\Tracker\TrackChanges;
// ...
#[ORM\Entity]
class Book
{
// ...
#[ORM\Column(type: Types::OBJECT)]
#[TrackChanges]
public object $data;
}