Symfony - 抛出异常从监听器返回 403

Symfony - Throw an exception returning 403 from a Listener

我正在使用 Symfony5ApiPlatform

我正在使用 Listener 执行多项任务,包括做一些 authorization 我无法在我的选民中完成的事情。

所以通过一个简单的条件我验证了我的实体的哪个字段被修改了。

我查看修改后的字段,检查它们是否与唯一可以修改的字段不同。

方法如下:

$modifiedValues = $eventArgs->getEntityManager()->getUnitOfWork()->getEntityChangeSet($eventArgs->getObject());

foreach ($modifiedValues as $key => $value) {
    if ("statut" != $key) {
        throw new AccessDeniedException('Vous ne pouvez pas modifier ce champ.');
    }    
}

现在我抛出一个 AccessDeniedException 我认为会 return 一个 403 但实际上 return 一个 500.

authorization 部分实际上在工作,但我对我的逻辑中的这个“异常”有点困扰,因为其他授权规则将 return 200403.

所以我的问题是:

感谢您的宝贵时间!

根据 documentation,您可以配置框架来捕获您的异常。

config/packages/api_platform.yaml

api_platform:
    exception_to_status:
        Symfony\Component\Security\Core\Exception\AccessDeniedException: 403

但您可能应该创建自己的异常 class,从 AcessDeniedException 扩展它并配置它。

src/Exception/AccessDeniedException.php

<?php

namespace App\Exception;

use Symfony\Component\Security\Core\Exception\AccessDeniedException;

class MyAccessDeniedException extends AccessDeniedException
{
}

config/packages/api_platform.yaml

api_platform:
    exception_to_status:
        App\Exception\MyAccessDeniedException: 403

Listener.php

$modifiedValues = $eventArgs->getEntityManager()->getUnitOfWork()->getEntityChangeSet($eventArgs->getObject());

foreach ($modifiedValues as $key => $value) {
    if ("statut" != $key) {
        throw new MyAccessDeniedException('Vous ne pouvez pas modifier ce champ.');
    }    
}