Symfony路由404报错及$this->getUser()无效问题排查求助
问题排查:Symfony路由404与$this->getUser()有效性问题
一、路由404错误修复
你的路由注解存在格式错误,Symfony的#[Route]注解中,路由名称必须通过name:显式声明,而非直接传递字符串参数。当前/member/insert和/member/update/{id}路由未正确注册,导致访问时出现404。
修复步骤:
- 修正路由注解格式:将路由名称参数改为
name: '路由名'的键值对形式 - 验证路由注册:执行命令
php bin/console debug:router,确认member_insert和member_update路由已出现在列表中
修正后的路由代码片段:
#[Route('/member/insert', name: 'member_insert')] public function insertStory(Request $request, EntityManagerInterface $entityManager): Response { // ... 原有代码 } #[Route('/member/update/{id}', name: 'member_update')] public function updateStory(Request $request, EntityManagerInterface $entityManager, int $id): Response { // ... 原有代码 }
二、$this->getUser()有效性问题修复
$this->getUser()在用户未登录时会返回null,直接使用会导致数据库查询失败或调用setUser(null)引发关联错误,同时存在越权修改他人内容的风险。
修复方案:
- 强制用户登录:导入
Symfony\Component\Security\Http\Attribute\IsGranted注解,为需要登录的方法添加#[IsGranted('ROLE_USER')],未登录用户会自动跳转至登录页 - 验证资源归属:在
updateStory方法中,检查当前用户是否为故事的所有者,防止越权修改 - 显式处理表单传递:传递表单到Twig时必须调用
createView(),否则模板无法正确渲染表单
修正后的完整MemberController代码:
<?php namespace App\Controller; use App\Entity\Story; use App\Form\StoryType; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Security\Http\Attribute\IsGranted; class MemberController extends AbstractController { #[Route('/member', name: 'app_member')] #[IsGranted('ROLE_USER')] public function index(EntityManagerInterface $entityManager): Response { $user = $this->getUser(); $stories = $entityManager->getRepository(Story::class)->findBy(['user' => $user]); return $this->render('member/index.html.twig', [ 'stories' => $stories, ]); } #[Route('/member/insert', name: 'member_insert')] #[IsGranted('ROLE_USER')] public function insertStory(Request $request, EntityManagerInterface $entityManager): Response { $message = 'Add story'; $story = new Story(); $form = $this->createForm(StoryType::class, $story); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $story->setUser($this->getUser()); $entityManager->persist($story); $entityManager->flush(); $this->addFlash('success', 'Successfully added a story'); return $this->redirectToRoute('app_member'); } return $this->render('adventure/handleStory.html.twig', [ 'form' => $form->createView(), 'message' => $message ]); } #[Route('/member/update/{id}', name: 'member_update')] #[IsGranted('ROLE_USER')] public function updateStory(Request $request, EntityManagerInterface $entityManager, int $id): Response { $message = 'Update story'; $story = $entityManager->getRepository(Story::class)->find($id); // 验证故事归属 if (!$story || $story->getUser() !== $this->getUser()) { throw $this->createAccessDeniedException('You cannot edit this story'); } $form = $this->createForm(StoryType::class, $story); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $entityManager->flush(); // 编辑已有实体无需重复persist $this->addFlash('success', 'Successfully updated a story'); return $this->redirectToRoute('app_member'); } return $this->render('adventure/handleStory.html.twig', [ 'form' => $form->createView(), 'message' => $message, ]); } }
内容的提问来源于stack exchange,提问作者frosh123
相关产品推荐
相关产品推荐

