我正在使用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)`.
所以我很难过。
可以吗?
有关更好方法的任何建议吗?
答案 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