Source of file BlameableSubscriber.php

Size: 2,264 Bytes - Last Modified: 2023-11-16T22:56:02+01:00

/home/websites/teicee/packagist/site/phpdoc/conf/../vendor/teicee/dorm-bundle/src/EventSubscriber/BlameableSubscriber.php

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
<?php

namespace TIC\DormBundle\EventSubscriber;

use Doctrine\ORM\Event\PrePersistEventArgs;
use Doctrine\ORM\Event\PreUpdateEventArgs;
use Doctrine\ORM\Events;
use Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface;
use http\Exception\InvalidArgumentException;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use TIC\CoreBundle\Util\ClassHelper;
use TIC\DormBundle\Traits\EntityBlameable;

class BlameableSubscriber implements EventSubscriberInterface
{

    private $tokenStorage;

    public function __construct(TokenStorageInterface $tokenStorage)
    {
        $this->tokenStorage = $tokenStorage;
    }


    public function getSubscribedEvents(): array
    {
        return [
            Events::prePersist,
            Events::preUpdate,
        ];
    }

    public function prePersist(PrePersistEventArgs $args): void
    {
        $object = $args->getObject();
        if (!$this->isBlameable($object)) return;

        $user = $this->checkUser();

        if ($user && is_object($object)) {
            $object->setCreatedBy($user);
            $object->setUpdatedBy($user);
        }
    }

    public function preUpdate(PreUpdateEventArgs $args): void
    {
        $object = $args->getObject();
        if (!$this->isBlameable($object)) return;

        $user = $this->checkUser();

        if ($user && is_object($object)) {
            $object->setUpdatedBy($user);
        }
    }

    public function isBlameable($object): bool
    {
        return ClassHelper::hasTrait($object, EntityBlameable::class);
    }

    public function checkUser()
    {
        $user = $this->tokenStorage->getToken() ? $this->tokenStorage->getToken()->getUser() : null;

        if ($user === null) {
            $user = (PHP_SAPI === "cli") ? 'admin' : 'anonymous';
        }

        if (is_object($user)) {
            if (method_exists($user, 'getBlameableName')) {
                return $user->getBlameableName();
            }
            if (method_exists($user, '__toString')) {
                return $user->__toString();
            }

            throw new InvalidArgumentException('User must be a string, or object shoud have method __toString');
        }

        return $user;
    }
}