Предполагая, что у вас есть правильное отношение "подписки" в вашей пользовательской сущности.
Вы можете попробовать что-то вроде:
public function getRoles()
{
$todayDate = new DateTime();
$activesSubscriptions = $this->subscriptions->filter(function($entity) use ($todayDate) {
return (($todayDate >= $entity->dateBegin()) && ($todayDate < $entity->dateEnd()));
});
if (!isEmpty($activesSubscriptions)) {
return array('ROLE_OK');
}
return array('ROLE_KO');
}
Смена роли может быть сделана с помощью:
$sc = $this->get('security.context')
$user = $sc->getToken()->getUser();
$user->setRole('ROLE_NEW');
// Assuming that "main" is your firewall name :
$token = new \Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken($user, null, 'main', $user->getRoles());
$sc->setToken($token);
Но после изменения страницы вызывается функция refreshUser провайдера, и иногда, как в случае с EntityUserProvider, роль перезаписывается запросом.Чтобы избежать этого, вам нужен специальный провайдер.