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

2022-08-30 21:55:41

我正在使用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)`.

所以我对此感到困惑。

能做到吗?

关于更好的方法的任何建议?


答案 1

您可以使用表达式语言组件中提供的 constant() 函数:

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

答案 2

Doctrine 注释阅读器使 PHP 代码中的常量更容易:

use MyCompany\Annotations\Bar;
use MyCompany\Entity\SomeClass;

/**
* @Foo(PHP_EOL)
* @Bar(Bar::FOO)
*/

这也与@Security / @IsGranted的预期一样工作。

https://www.doctrine-project.org/projects/doctrine-annotations/en/latest/custom.html#constants


推荐