Symfony 4中redirectToRoute()后Flash Messages无法正常工作求助
我来帮你捋一捋这个问题——按说Flash Messages配合redirect是Symfony里很基础的操作,大概率是某个细节没注意到,结合你给出的代码片段,我们从这几个方向排查:
1. 先补全删除方法的请求方法注解
你写的@Method("POS...明显没写完,正确的应该是@Method("POST"),或者更推荐用Route注解里的methods参数:
/** * @Route("/fin/carteira/{id}/delete", name="carteira_delete", methods={"POST"}) */
如果请求方法配置错误,可能会导致删除逻辑没正确执行,自然也不会触发Flash Message的设置。
2. 确认删除方法里正确调用了addFlash()
很多时候是忘记添加这一步!你需要在删除逻辑完成后(不管成功还是失败),明确调用addFlash()来存储临时消息,比如:
// 删除成功时 $this->addFlash('success', 'Carteira deletada com sucesso!'); // 删除失败时 $this->addFlash('error', 'Falha ao deletar a carteira.');
注意第一个参数是消息类型(比如success/error),第二个是消息内容,类型要和模板里渲染的对应上。
3. 检查模板是否正确渲染Flash Messages
就算后端加了Flash,模板里没写渲染逻辑也看不到!打开你的financeiro/carteiraList.html.twig,确认有没有这段代码:
{# 渲染成功消息 #} {% for message in app.flashes('success') %} <div class="alert alert-success">{{ message }}</div> {% endfor %} {# 渲染错误消息 #} {% for message in app.flashes('error') %} <div class="alert alert-danger">{{ message }}</div> {% endfor %}
这里的app.flashes()要传入你在后端设置的消息类型,比如你用了'success',模板里就要对应app.flashes('success')。
4. 确保redirect前没有输出内容
如果在redirectToRoute()之前,你用了echo、var_dump或者其他输出内容的代码,会导致HTTP Headers提前发送,Symfony的Flash Messages是存在Session里的,Headers发送后Session无法正确写入,自然就丢了消息。
5. 检查Session配置是否正常
Flash Messages依赖Symfony的Session组件,确认你的项目Session是正常启用的——一般默认是启用的,但如果之前修改过config/packages/framework.yaml里的session配置,要确保没关掉。
最后给你一个完整的删除方法示例,你可以对照着调整:
/** * @Route("/fin/carteira/{id}/delete", name="carteira_delete", methods={"POST"}) */ public function delete(Request $request, Carteira $carteira) { // 一定要加CSRF保护,防止恶意请求 $csrfToken = $request->request->get('_token'); if (!$this->isCsrfTokenValid('delete_carteira_' . $carteira->getId(), $csrfToken)) { $this->addFlash('error', 'Token de segurança inválido!'); return $this->redirectToRoute('carteira_list'); } try { $entityManager = $this->getDoctrine()->getManager(); $entityManager->remove($carteira); $entityManager->flush(); $this->addFlash('success', 'Carteira removida com sucesso!'); } catch (\Exception $e) { $this->addFlash('error', 'Não foi possível remover a carteira: ' . $e->getMessage()); } return $this->redirectToRoute('carteira_list'); }
内容的提问来源于stack exchange,提问作者chuckedw

