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

生成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:46:16