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
相关产品推荐
相关产品推荐

