我发现在Symfony中我可以使用注释以干净的方式为我的控制器方法添加额外的功能。像这样举例如:
/**
* @Route("/{id}")
* @IsGranted("view", subject="product")
* @return Response
*/
public function view(Product $product)
{
dump(compact('product'));
return new Response('It worked!');
}
但是,对于创建方法,我没有产品实例,所以我想使用@IsGranted
注释作为主题字符串" App \ Entity \后&#34 ;.我希望我能这样做:
/**
* @Route("/")
* @IsGranted("create", subject=Product::class)
* @return Response
*/
public function create()
{
return new Response('Did it work?');
}
但遗憾的是我收到以下错误:Could not find the subject "App\Entity\Product" for the @IsGranted annotation. Try adding a "$App\Entity\Product" argument to your controller method.
所以@IsGranted
仍然认为它应该寻找名为$App\Entity\Product
的方法参数。有没有办法只用字符串文字就可以使用它?
答案 0 :(得分:1)
你不能省略主题属性吗?
我还没有使用过注释,但我知道Symfony auth checker允许调用" isGranted"没有主题。
请参阅此处的示例:https://symfony.com/doc/current/security.html#securing-controllers-and-other-code
答案 1 :(得分:1)
另一种方式:
class AnotherController extends AbstractDashboardController
{
public function index(): Response
{
$this->denyAccessUnlessGranted('MY_VOTER', 'my_variable');
//...
}
}
与 'IsGranted' 注释不同,方法 'denyAccessUnlessGranted' 使用字符串更容易 ;)
答案 2 :(得分:0)
这是旧帖子,但这是您可以完成的方式:
/**
* @Route("/", defaults={"my_string": "my_content"})
* @IsGranted("MY_VOTER", subject="my_string")
*/