<?php
declare(strict_types=1);
namespace Slivki\Services\Switcher;
use Exception;
use Psr\Log\LoggerInterface;
use Slivki\Entity\ServerFeatureState;
use Slivki\Entity\User;
use Slivki\Services\UserGetter;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
final class FeatureStateEvaluator
{
private ParameterBagInterface $parameterBag;
private LoggerInterface $logger;
private UserGetter $userGetter;
public function __construct(
ParameterBagInterface $parameterBag,
LoggerInterface $logger,
UserGetter $userGetter
) {
$this->parameterBag = $parameterBag;
$this->logger = $logger;
$this->userGetter = $userGetter;
}
public function evaluate(ServerFeatureState $serverFeatureState): bool
{
$expressionLanguage = new ExpressionLanguage();
$user = $this->userGetter->find();
try {
return $expressionLanguage->evaluate(
$serverFeatureState->getEligibilityRule(),
[
'config' => $this->parameterBag->all(),
'user' => $user ?? new User(),
]
);
} catch (Exception $exception) {
$this->logger->error('Server feature state does not exist. Feature may works incorrectly.', [
'exception' => $exception,
]);
}
return false;
}
}