You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony/API Platform为PATCH路由添加Provider导致空值错误

问题:API Platform PATCH路由自定义数据提供者返回空对象导致路由失效

我在User实体里声明了两个需要令牌认证的PATCH路由,想要从令牌中获取用户数据而非URI变量,但自定义数据提供者生效后路由完全失效。通过自定义状态处理器排查发现,数据提供者返回的对象几乎全为null。之前在其他路由使用数据提供者没有问题,但从未在PATCH路由中用过,怀疑是不是遗漏了注解?感觉API Platform仍在尝试从原URL(users/{id})获取用户。

User实体代码

#[ApiResource(
    operations: [
        new Get(
            normalizationContext: ['groups' => ['user:read']],
        ),
        new Patch(//for password and email
            name: 'credentials',
            uriTemplate: '/users/credentials',
            processor: UserCredentialsPersistStateProcessor::class,
            validationContext: ['groups' => ['user:write_credentials']],
            denormalizationContext: ['groups' => ['user:write_credentials']],
            security: "is_granted('ROLE_REDDIT_ADMIN') or is_granted('ROLE_USER')",
            securityMessage: "Only user himself can modify his settings.",
            provider: UserFromTokenProvider::class,
            // input: User::class,
        ),
        new Patch(// for all other settings 
            uriTemplate: '/users',
            denormalizationContext: ['groups'=> ['user:write']],
            security: "is_granted('ROLE_REDDIT_ADMIN') or is_granted('ROLE_USER')",
            securityMessage: "Only user himself can modify his settings.",
            provider: UserFromTokenProvider::class,
        ),
         //rest of routes
    ],
)]

自定义数据提供者代码

class UserFromTokenProvider implements ProviderInterface
{
    public function __construct(
        private UserRepository $repository,
        private Security $security
    ) {
    }

    public function provide(Operation $operation, array $uriVariables = [], array $context = []): User|null
    {
        $currentUser = $this->security->getUser();
        if ($currentUser !== null) {
            $user = $this->repository->findOneBy(['login' => $currentUser->getUserIdentifier()]);
            return $user;

        } else {
            throw new ItemNotFoundException('Token is not assosiated with user.', 404);
        }
    }
}

调试输出(var_dump结果)

object(App\Entity\User)#6754 (17) {
  ["id":"App\Entity\User":private]=>
  NULL
  ["login":"App\Entity\User":private]=>
  NULL
  ["nickname":"App\Entity\User":private]=>
  NULL
  ["email":"App\Entity\User":private]=>
  NULL
  ["newEmail":"App\Entity\User":private]=>
  string(16) "user@example.com"
  ["description":"App\Entity\User":private]=>
  NULL
  ["password":"App\Entity\User":private]=>
  NULL
  ["plainOldPassword":"App\Entity\User":private]=>
  string(6) "string"
  ["plainPassword":"App\Entity\User":private]=>
  string(6) "string"
  ["isNSFW":"App\Entity\User":private]=>
  bool(false)
  ["roles":"App\Entity\User":private]=>
  array(1) {
    [0]=>
    string(9) "ROLE_USER"
  }
}

我尝试过修改提供者,返回null、ID为1的完整对象、抛出异常,结果均无变化。

内容的提问来源于stack exchange,提问作者Matthew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 20:03:18