生成slug时Twig报错:缺少生成URL所需的“slug”参数
解决Twig生成Slug URL时的参数缺失问题
咱们先直接定位核心问题,这些细节没处理好才导致了报错:
1. 控制器获取数据的方法有误
你用了$repository->findBy($id),但findBy()要求接收关联数组当参数(比如findBy(['id' => $id])),而且它返回的是对象数组,不是单个Item实体。这会让模板拿到的是数组,而非带slug属性的单个对象,自然没法生成slug URL。
应该改成用find()方法,它直接接收主键ID,返回单个实体:
$item = $repository->find($id); // 更严谨的写法:处理商品不存在的情况 $item = $repository->findOneBy(['id' => $id]); if (!$item) { throw $this->createNotFoundException('该商品不存在'); }
2. 模板变量传递的命名问题
你传的模板变量是["items"=>$item],复数命名但实际是单个对象,很容易在Twig里搞混。建议改成单数item,更直观:
return $this->render("item/prodpage.html.twig", ["item"=>$item]);
3. 确保实体类有Slug属性及访问器
你的Item实体必须有slug字段,并且要有对应的getSlug() getter方法,这样Twig才能通过{{ item.slug }}获取到slug值,进而生成正确的URL。
4. 路由与URL生成的对应
如果你有两个路由(/item/{id}和/item/{slug}),在Twig里生成URL时要指定正确的路由名称,并传对应参数:
- 生成基于ID的URL:
{{ path('app_showitem_getid', {'id': item.id}) }} - 生成基于Slug的URL:
{{ path('app_showitem_getslug', {'slug': item.slug}) }}
(记得替换成你实际的slug路由完整名称,比如你提到的app_sho...补全后的正确命名)
完整修正后的控制器代码示例
/** * @Route("/item/{id}", name="app_showitem_getid", requirements={"id": "\d+"}) * @param int $id * @return Response * @throws \Doctrine\ORM\NonUniqueResultException */ public function getid(int $id):Response { $repository = $this->getDoctrine()->getRepository(Item::class); $item = $repository->find($id); if (!$item) { throw $this->createNotFoundException('未找到指定商品'); } return $this->render("item/prodpage.html.twig", ["item"=>$item]); }
调整完这些,Twig就能拿到带slug属性的单个Item对象,生成URL时就不会再报缺少slug参数的错误啦。
内容的提问来源于stack exchange,提问作者Moni
相关产品推荐
相关产品推荐

