Как использовать константы классов в аннотации @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