<?php
/**
* @Author: Stephan<srandriamahenina@bocasay.com>
* @Date: 2017-10-11 10:56:38
* @Last Modified by: stephan <m6ahenina@gmail.com>
* @Last Modified time: 2020-01-28 09:59:56
*/
namespace App\Twig;
use App\Security\Authorization\GroupRoles;
use App\Utils\Resolver;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
use Twig\TwigFunction;
class SecurityExtension extends AbstractExtension
{
public function __construct(AuthorizationCheckerInterface $authorizationChecker, SerializerInterface $serializer, TranslatorInterface $translator)
{
$this->authorizationChecker = $authorizationChecker;
$this->serializer = $serializer;
$this->translator = $translator;
}
public function getFilters()
{
return [
new TwigFilter('roleAttr', [$this, 'roleAttr']),
new TwigFilter('roleObject', [$this, 'roleObject']),
new TwigFilter('serialize', [$this, 'serialize']),
new TwigFilter('normalize', [$this, 'normalize']),
new TwigFilter('group_role', [$this, 'groupRole'])
];
}
public function getFunctions()
{
return [
new TwigFunction('roleAttr', [$this, 'roleAttr']),
new TwigFunction('roleObject', [$this, 'roleObject']),
new TwigFunction('is_allowed', [$this, 'isAllowed']),
new TwigFunction('serialize', [$this, 'serialize']),
new TwigFunction('normalize', [$this, 'normalize']),
];
}
public function isAllowed($role = null)
{
if (is_null($role)) {
return true;
}
return $this->authorizationChecker->isGranted($this->roleAttr($role), $this->roleObject($role));
}
public function roleAttr($role)
{
if (is_array($role)) {
return $role[0];
}
return $role;
}
public function roleObject($role)
{
if (is_array($role)) {
if (count($role) > 1) {
return $role[1];
}
}
return null;
}
public function serialize($data, $format = 'json', array $context = [])
{
return $this->serializer->serialize($data, $format, $context);
}
public function normalize($object, $format = null, array $context = [])
{
return $this->serializer->normalize($object, $format, $context);
}
public function groupRole($role = null): string
{
$choices = array_flip(GroupRoles::ROLES);
return $this->translator->trans(Resolver::resolve([$choices, $role], ''));
}
}