Как использовать константы классов в аннотации @Security, используя язык выражений Symfony?
я использую Symfony 3, и я создал пользовательский класс избирателей.
Я хочу получить к нему доступ с помощью SensioFrameworkExtraBundle @Security
тег.
это вроде как работает.
если я сделаю следующее, он отлично работает:
/**
* @RestGet("organisation/{id}")
* @Security("is_granted('OrgAdmin', id)")
* @param int $id
* @param Request $request
*
* @return View
*/
public function getOrganisationAction($id, Request $request)
{
но мне не нравится идея использования магических строк в приложении, и я бы предпочел использовать константу класса для проверки.
что-то вроде этого:
/**
* @RestGet("organisation/{id}")
* @Security("is_granted(AppBundleOrgRoles::ROLE_ADMIN, id)")
* @param int $id
* @param Request $request
*
* @return View
*/
public function getOrganisationAction($id, Request $request)
{
но когда Я пытаюсь получить следующее сообщение об ошибке:
Unexpected character "\" around position 20 for expression `is_granted(AppBundleOrgRoles::ROLE_ADMIN, id)`.
который, когда без эскапады, является следующим:
Unexpected character "" around position 20 for expression `is_granted(AppBundleOrgRoles::ROLE_ADMIN, id)`.
так что я в тупике.
можно ли это сделать?
есть предложения по лучшему способу сделать это?
2 ответов
можно использовать constant()
функция доступна в компоненте языка выражений:
@Security("is_granted(constant('\Full\Namespace\To\OrgRoles::ROLE_ADMIN'), id)")
Doctrine annotation reader сделал это еще проще для констант в PHP-коде:
use MyCompany\Annotations\Bar;
use MyCompany\Entity\SomeClass;
/**
* @Foo(PHP_EOL)
* @Bar(Bar::FOO)
*/
Это также работает так же, как ожидалось для @Security / @IsGranted.
http://doctrine-common.readthedocs.io/en/latest/reference/annotations.html#constants