From 8c8f5118cf1951a228e61b5e2d8913deb8e5183c Mon Sep 17 00:00:00 2001 From: Nyholm Date: Fri, 13 Dec 2019 22:10:04 +0100 Subject: [PATCH] Added support for Symfony 4 and 5 --- .travis.yml | 11 ++--- DependencyInjection/Configuration.php | 11 +++-- .../HappyrEventTrackerExtension.php | 5 +- Entity/LogRepository.php | 4 +- ...ager.php => AggressiveDatabaseManager.php} | 48 ++++++++----------- Manager/DatabaseManager.php | 44 +++++------------ Manager/EventTrackerManager.php | 41 ++++++++-------- Manager/EventTrackerManagerInterface.php | 18 +++++++ Resources/config/services.yml | 28 +++++------ Service/EventListener.php | 13 ++--- Twig/EventTrackerExtension.php | 10 ++-- composer.json | 13 +++-- 12 files changed, 117 insertions(+), 129 deletions(-) rename Manager/{AggressiveManager.php => AggressiveDatabaseManager.php} (60%) create mode 100644 Manager/EventTrackerManagerInterface.php diff --git a/.travis.yml b/.travis.yml index da1b26c..6c989f2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,14 +1,9 @@ language: php php: - - 5.4 - - 5.5 - - 5.6 - - 7.0 - - hhvm - -before_install: - - composer self-update + - 7.2 + - 7.3 + - 7.4 install: - composer update diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 4f396e5..da60c06 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -15,10 +15,15 @@ class Configuration implements ConfigurationInterface */ public function getConfigTreeBuilder() { - $treeBuilder = new TreeBuilder(); - $root = $treeBuilder->root('happyr_event_tracker'); + $treeBuilder = new TreeBuilder('happyr_event_tracker'); + // Keep compatibility with symfony/config < 4.2 + if (!\method_exists($treeBuilder, 'getRootNode')) { + $rootNode = $treeBuilder->root('happyr_event_tracker'); + } else { + $rootNode = $treeBuilder->getRootNode(); + } - $root->children() + $rootNode->children() ->append($this->getEventNode()) ->enumNode('manager')->values(array('database', 'aggressive'))->defaultValue('database')->end() ->end(); diff --git a/DependencyInjection/HappyrEventTrackerExtension.php b/DependencyInjection/HappyrEventTrackerExtension.php index 4ba97a2..560fab8 100644 --- a/DependencyInjection/HappyrEventTrackerExtension.php +++ b/DependencyInjection/HappyrEventTrackerExtension.php @@ -2,6 +2,8 @@ namespace Happyr\EventTrackerBundle\DependencyInjection; +use Happyr\EventTrackerBundle\Manager\EventTrackerManagerInterface; +use Happyr\EventTrackerBundle\Service\EventListener; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\Config\FileLocator; use Symfony\Component\HttpKernel\DependencyInjection\Extension; @@ -21,7 +23,7 @@ public function load(array $configs, ContainerBuilder $container) $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader->load('services.yml'); - $listener = $container->getDefinition('happyr.event_tracker.event_listener'); + $listener = $container->getDefinition(EventListener::class); $eventMap = array(); foreach ($config['events'] as $name => $event) { @@ -33,5 +35,6 @@ public function load(array $configs, ContainerBuilder $container) $listener->replaceArgument(2, $eventMap); $container->setAlias('happyr.event_tracker.manager', 'happyr.event_tracker.manager.'.$config['manager']); + $container->setAlias(EventTrackerManagerInterface::class, 'happyr.event_tracker.manager.'.$config['manager']); } } diff --git a/Entity/LogRepository.php b/Entity/LogRepository.php index 95219d4..eeb4984 100644 --- a/Entity/LogRepository.php +++ b/Entity/LogRepository.php @@ -16,7 +16,7 @@ class LogRepository extends EntityRepository * * @return \Happyr\EventTrackerBundle\Entity\Log[] */ - public function getEventsByTarget($namespace, $target, $action = null) + public function getEventsByTarget($namespace, $target, $action = null): array { $criteria = array('namespace' => $namespace, 'target' => $target); @@ -36,7 +36,7 @@ public function getEventsByTarget($namespace, $target, $action = null) * * @return \Happyr\EventTrackerBundle\Entity\Log[] */ - public function getEventsByUser($user, $namespace = null, $action = null) + public function getEventsByUser($user, $namespace = null, $action = null): array { $criteria = array('user' => $user); diff --git a/Manager/AggressiveManager.php b/Manager/AggressiveDatabaseManager.php similarity index 60% rename from Manager/AggressiveManager.php rename to Manager/AggressiveDatabaseManager.php index 7ce78fa..2ee2da0 100644 --- a/Manager/AggressiveManager.php +++ b/Manager/AggressiveDatabaseManager.php @@ -2,26 +2,32 @@ namespace Happyr\EventTrackerBundle\Manager; +use Doctrine\ORM\EntityManagerInterface; use Happyr\EventTrackerBundle\Entity\Log; /** - * @author Tobias Nyholm * This manager fetches all the events related to the target and store them im a memory cache. + * + * @author Tobias Nyholm */ -class AggressiveManager extends DatabaseManager +final class AggressiveDatabaseManager extends EventTrackerManager { /** * @var array storage A storage with previous data that we fetched */ private $storage; + private $em; + + public function __construct(EntityManagerInterface $em) + { + $this->em = $em; + } + /** - * @param $target - * @param $action - * - * @return Log|void + * {@inheritdoc} */ - public function getLog($target, $action) + public function getLog($target, string $action): ?Log { $class = $this->getNamespace($target); $key = $this->getKey($target, $class); @@ -30,34 +36,25 @@ public function getLog($target, $action) $this->fetchFromDb($target, $class); } - if (!isset($this->storage[$key][$action])) { - return; - } - - $log = $this->storage[$key][$action]; - - return $log; + return $this->storage[$key][$action] ?? null; } /** * fetch all actions on this target. * - * @param $target - * @param $class - * - * @return Log + * @param mixed $target */ - private function fetchFromDb($target, $class) + private function fetchFromDb($target, string $class) { $key = $this->getKey($target, $class); - $logs = $this->em->getRepository('HappyrEventTrackerBundle:Log') + $logs = $this->em->getRepository(Log::class) ->findBy( - array( + [ 'namespace' => $class, 'target' => $target->getId(), - ), - array('time' => 'DESC') + ], + ['time' => 'DESC'] ); foreach ($logs as $log) { @@ -68,12 +65,9 @@ private function fetchFromDb($target, $class) } /** - * @param $target * @param $class - * - * @return string */ - private function getKey($target, $class) + private function getKey($target, string $class): string { return $class.$target->getId(); } diff --git a/Manager/DatabaseManager.php b/Manager/DatabaseManager.php index 0c03313..a295693 100644 --- a/Manager/DatabaseManager.php +++ b/Manager/DatabaseManager.php @@ -6,59 +6,37 @@ use Happyr\EventTrackerBundle\Entity\Log; /** - * @author Tobias Nyholm + * @author Tobias Nyholm */ -class DatabaseManager extends EventTrackerManager +final class DatabaseManager extends EventTrackerManager { - /** - * @var EntityManagerInterface em - */ - protected $em; + private $em; - /** - * @param EntityManagerInterface $em - */ public function __construct(EntityManagerInterface $em) { $this->em = $em; } /** - * @param $target - * @param $action - * - * @return Log|void + * {@inheritdoc} */ - public function getLog($target, $action) + public function getLog($target, string $action): ?Log { $class = $this->getNamespace($target); - if (null === $log = $this->em->getRepository('HappyrEventTrackerBundle:Log') - ->findOneBy( - array( + if (null === $log = $this->em->getRepository(Log::class) + ->findOneBy( + [ 'namespace' => $class, 'target' => $target->getId(), 'action' => $action, - ), - array('time' => 'DESC') + ], + ['time' => 'DESC'] ) ) { - return; + return null; } return $log; } - - /** - * @param $target - * - * @return string - */ - protected function getNamespace($target) - { - $fqn = get_class($target); - $class = strtolower(substr($fqn, strrpos($fqn, '\\') + 1)); - - return $class; - } } diff --git a/Manager/EventTrackerManager.php b/Manager/EventTrackerManager.php index 1b9c5bf..5d463cd 100644 --- a/Manager/EventTrackerManager.php +++ b/Manager/EventTrackerManager.php @@ -5,48 +5,47 @@ use Happyr\EventTrackerBundle\Entity\Log; /** - * @author Tobias Nyholm + * @author Tobias Nyholm */ -abstract class EventTrackerManager +abstract class EventTrackerManager implements EventTrackerManagerInterface { /** - * @param $target - * - * @return Log + * @param mixed $target */ - abstract public function getLog($target, $action); - - /** - * @param $target - * - * @return Log - */ - public function getCreatedLog($target) + public function getCreatedLog($target): Log { return $this->getLog($target, 'created'); } /** - * @param $target - * - * @return \Happyr\EventTrackerBundle\Entity\EventUserInterface|void + * @param mixed $target */ - public function getCreator($target) + public function getCreator($target): ?EventUserInterface { if (null === $log = $this->getCreatedLog($target)) { - return; + return null; } return $log->getUser(); } + /** + * @param mixed $target + */ + public function getUpdatedLog($target): Log + { + return $this->getLog($target, 'updated'); + } + /** * @param $target * - * @return Log + * @return string */ - public function getUpdatedLog($target) + protected function getNamespace($target) { - return $this->getLog($target, 'updated'); + $fqn = \get_class($target); + + return \mb_strtolower(\mb_substr($fqn, \mb_strrpos($fqn, '\\') + 1)); } } diff --git a/Manager/EventTrackerManagerInterface.php b/Manager/EventTrackerManagerInterface.php new file mode 100644 index 0000000..0ae735f --- /dev/null +++ b/Manager/EventTrackerManagerInterface.php @@ -0,0 +1,18 @@ + + */ +interface EventTrackerManagerInterface +{ + /** + * @param mixed $target + */ + public function getLog($target, string $action): ?Log; +} diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 3be0c12..9971371 100644 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -1,25 +1,25 @@ parameters: services: - happyr.event_tracker.event_listener: - class: Happyr\EventTrackerBundle\Service\EventListener + happyr.event_tracker.event_listener: '@Happyr\EventTrackerBundle\Service\EventListener' + Happyr\EventTrackerBundle\Service\EventListener: arguments: - - "@doctrine.orm.entity_manager" - - "@security.token_storage" + - '@doctrine.orm.entity_manager' + - '@security.token_storage' - [] - happyr.event_tracker.manager.aggressive: - class: Happyr\EventTrackerBundle\Manager\AggressiveManager + happyr.event_tracker.manager.aggressive: '@Happyr\EventTrackerBundle\Manager\AggressiveDatabaseManager' + Happyr\EventTrackerBundle\Manager\AggressiveDatabaseManager: arguments: - - "@doctrine.orm.entity_manager" + - '@doctrine.orm.entity_manager' - happyr.event_tracker.manager.database: - class: Happyr\EventTrackerBundle\Manager\DatabaseManager + happyr.event_tracker.manager.database: '@Happyr\EventTrackerBundle\Manager\DatabaseManager' + Happyr\EventTrackerBundle\Manager\DatabaseManager: arguments: - - "@doctrine.orm.entity_manager" + - '@doctrine.orm.entity_manager' - happyr.event_tracker.twig: - class: Happyr\EventTrackerBundle\Twig\EventTrackerExtension - arguments: [ "@happyr.event_tracker.manager" ] + happyr.event_tracker.twig: '@Happyr\EventTrackerBundle\Twig\EventTrackerExtension' + Happyr\EventTrackerBundle\Twig\EventTrackerExtension: + arguments: [ '@Happyr\EventTrackerBundle\Manager\EventTrackerManagerInterface' ] tags: - - { name: twig.extension } \ No newline at end of file + - { name: twig.extension } diff --git a/Service/EventListener.php b/Service/EventListener.php index e71d026..098fb32 100644 --- a/Service/EventListener.php +++ b/Service/EventListener.php @@ -6,7 +6,7 @@ use Happyr\EventTrackerBundle\Entity\EventUserInterface; use Happyr\EventTrackerBundle\Entity\Log; use Happyr\EventTrackerBundle\Event\TrackableEventInterface; -use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; +use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; /** * @author Tobias Nyholm @@ -24,16 +24,11 @@ class EventListener protected $em; /** - * @var TokenStorage tokenStorage + * @var TokenStorageInterface tokenStorage */ protected $tokenStorage; - - /** - * @param EntityManagerInterface $em - * @param TokenStorage $tokenStorage - * @param array $actionMap - */ - public function __construct(EntityManagerInterface $em, TokenStorage $tokenStorage, array $actionMap = array()) + + public function __construct(EntityManagerInterface $em, TokenStorageInterface $tokenStorage, array $actionMap = array()) { $this->actionMap = $actionMap; $this->em = $em; diff --git a/Twig/EventTrackerExtension.php b/Twig/EventTrackerExtension.php index 61099e8..d2dca66 100644 --- a/Twig/EventTrackerExtension.php +++ b/Twig/EventTrackerExtension.php @@ -3,11 +3,13 @@ namespace Happyr\EventTrackerBundle\Twig; use Happyr\EventTrackerBundle\Manager\EventTrackerManager; +use Twig\Extension\AbstractExtension; +use Twig\TwigFilter; /** * @author Tobias Nyholm */ -class EventTrackerExtension extends \Twig_Extension +class EventTrackerExtension extends AbstractExtension { /** * @var EventTrackerManager etm @@ -28,9 +30,9 @@ public function __construct(EventTrackerManager $etm) public function getFilters() { return array( - new \Twig_SimpleFilter('createdBy', array($this->etm, 'getCreatedLog')), - new \Twig_SimpleFilter('updatedBy', array($this->etm, 'getUpdatedLog')), - new \Twig_SimpleFilter('actionedBy', array($this->etm, 'getLog')), + new TwigFilter('createdBy', array($this->etm, 'getCreatedLog')), + new TwigFilter('updatedBy', array($this->etm, 'getUpdatedLog')), + new TwigFilter('actionedBy', array($this->etm, 'getLog')), ); } diff --git a/composer.json b/composer.json index 6ef2406..8f12dc8 100644 --- a/composer.json +++ b/composer.json @@ -12,16 +12,15 @@ } ], "require": { - "php": ">=5.4", - "doctrine/orm": "^2.3", - "symfony/event-dispatcher": "^2.3 || ^3.0 || ^4.0", - "symfony/security": "^2.3 || ^3.0 || ^4.0" + "php": "^7.2", + "doctrine/orm": "^2.6", + "symfony/event-dispatcher": "^2.3 || ^3.4 || ^4.4 || ^5.0", + "symfony/security": "^3.4 || ^4.4 || ^4.0" }, "autoload": { - "psr-0": { + "psr-7": { "Happyr\\EventTrackerBundle\\": "" } - }, - "target-dir": "Happyr/EventTrackerBundle" + } }