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

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)引发关联错误,同时存在越权修改他人内容的风险。

修复方案:

  1. 强制用户登录:导入Symfony\Component\Security\Http\Attribute\IsGranted注解,为需要登录的方法添加#[IsGranted('ROLE_USER')],未登录用户会自动跳转至登录页
  2. 验证资源归属:在updateStory方法中,检查当前用户是否为故事的所有者,防止越权修改
  3. 显式处理表单传递:传递表单到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:24:53