已注册的kernel.view事件未触发,POST请求密码加密逻辑失效
问题排查与解决方案
你遇到的问题是:基于Symfony+ApiPlatform构建用户系统时,已注册的PasswordHasherSubscriber监听KernelEvents::VIEW事件,但实际未执行,POST请求时无dd($entity)输出,甚至故意写错函数也无报错。以下是针对性的排查和解决步骤:
1. 确认实体为ApiPlatform资源
KernelEvents::VIEW事件在ApiPlatform流程中触发的前提是:你的User实体已被标记为ApiPlatform资源,且支持POST操作。在实体类上添加注解:
// src/Entity/User.php namespace App\Entity; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\Post; #[ApiResource( operations: [ new Post(), // 其他需支持的操作 ] )] class User { // 实体字段、getter/setter... }
2. 精准过滤触发条件
修改订阅者代码,只处理POST请求和目标实体,避免因范围太宽导致的逻辑失效:
// src/EventSubscriber/PasswordHasherSubscriber.php public function hashPassword(ViewEvent $event): void { $request = $event->getRequest(); // 仅处理POST请求 if ($request->getMethod() !== 'POST') { return; } $entity = $event->getControllerResult(); // 仅处理User实体 if (!$entity instanceof \App\Entity\User) { return; } dd($entity); // 此时POST创建用户应能输出实体内容 }
3. 验证订阅者服务注册
检查config/services.yaml,确保订阅者被正确注册为事件订阅者(make:subscriber通常已自动配置,但可手动确认):
# config/services.yaml services: _defaults: autowire: true autoconfigure: true App\EventSubscriber\PasswordHasherSubscriber: tags: - { name: kernel.event_subscriber }
4. 调整事件优先级
从你的事件列表看,订阅者优先级为33,位于WriteListener之前,但如果前面的监听器(如ValidateListener)提前终止了事件传播,会导致后续逻辑不执行。可尝试提高优先级,确保先执行:
public static function getSubscribedEvents(): array { return [ KernelEvents::VIEW => ['hashPassword', 65], // 高于ValidateListener的64 ]; }
5. 排查自定义控制器场景(若适用)
如果是自定义控制器处理POST请求,需确保控制器返回实体对象而非Response实例,否则KernelEvents::VIEW不会触发:
// 正确示例(会触发事件) public function createUser(Request $request): User { $user = new User(); // 绑定请求数据到实体 return $user; } // 错误示例(不会触发事件) public function createUser(Request $request): Response { $user = new User(); // 绑定请求数据到实体 return new JsonResponse(['id' => $user->getId()]); }
内容的提问来源于stack exchange,提问作者grobet
相关产品推荐
相关产品推荐

