如何使用Symfony表达式语言在@Security批注中使用类常量?

时间:2017-06-16 13:52:18

标签: php symfony namespaces expression

我正在使用Symfony 3并且我已经创建了一个自定义Voter类。

我想使用SensioFrameworkExtraBundle @Security代码访问它。

它有点工作。

如果我执行以下操作,它将完美运行:

 /**
 * @Rest\Get("organisation/{id}")
 * @Security("is_granted('OrgAdmin', id)")
 * @param int     $id
 * @param Request $request
 *
 * @return View
 */
public function getOrganisationAction($id, Request $request)
{

但我不喜欢在应用程序中使用魔术字符串的想法,我宁愿使用类常量进行检查。

这样的事情:

/**
 * @Rest\Get("organisation/{id}")
 * @Security("is_granted(AppBundle\OrgRoles::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(AppBundle\\OrgRoles::ROLE_ADMIN, id)`.

未转义时,如下:

Unexpected character "\" around position 20 for expression `is_granted(AppBundle\OrgRoles::ROLE_ADMIN, id)`.

所以我很难过。

可以吗?

有关更好方法的任何建议吗?

2 个答案:

答案 0 :(得分:10)

您可以使用constant()中提供的Expression Language Component功能:

@Security("is_granted(constant('\\Full\\Namespace\\To\\OrgRoles::ROLE_ADMIN'), id)")

答案 1 :(得分:3)

Doctrine注释阅读器使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