symfony - Symfony 5 - 在类别 url 中显示 id 和 slug 并在更新 slug 时通过 id 找到它
问题描述
我的类别 url 同时包含 id 和 slug,例如https://myapp.com/category/56-category-name(数据库中的 id 字段 = 56 和 slug 字段 = 类别名称),当更新类别名称时,数据库中的 slug 字段已更新,但 id 仍然相同。我想显示我的类别,只要 id 正确,当然显示正确的 url。在这种情况下,我认为 SEO 仍然正确。
这是我的展示方法:
/**
* @Route("/category/{id}-{slug}", name="category_show", requirements={"id"="\d+"})
*/
public function show(CategoryRepository $categoryRepository, $slug, $id): Response
{
$category = $categoryRepository->find($id);
if($category->getSlug() !== $slug) {
return $this->redirectToRoute('category_show', [
'id' => $id,
'slug' => $category->getSlug()
]);
}
return $this->render('category/show.html.twig', [
'category' => $category
]);
}
如果给定的 id 存在于 DB 中,它就可以工作,否则我在 null 上收到一个错误 Call to a member function getSlug()。我可以抛出 NotFoundException,但我认为这种方法使用了多次查询。
所以请帮助我以更大的灵活性和性能正确地完成这些。如果我想在帖子网址中显示类别以及https://myapp.com/56-category-name/23-post-title怎么办?
提前致谢
解决方案
使用findOneBy()并检查结果是否为null
/**
* @Route("/category/{id}-{slug}", name="category_show", requirements={"id"="\d+"})
* @Route("/{id}-{slug}/{idArticle}-{postSlug}", name="article_show", requirements={"idArticle"="\d+"})
*/
public function show(CategoryRepository $categoryRepository, $slug, $id, $idArticle = false, $postSlug = false ): Response
{
$category = $categoryRepository->findOneBy(['id'=>$id]);
if(is_null($category)){
throw new NotFoundHttpException(); //404, nothing found
}else{
//Category found.
if($idArticle){ // https://myapp.com/56-category-name/23-post-title
//Article route, put your logic here
}else{ //https://myapp.com/category/56-category-name
// Category route, logic here
if($category->getSlug() !== $slug) {
return $this->redirectToRoute('category_show', [
'id' => $id,
'slug' => $category->getSlug()
]);
}
return $this->render('category/show.html.twig', [
'category' => $category
]);
}
}
}
推荐阅读
- gtk - 运行 python 时出现 GTK 警告
- python - Python:是否可以包装“@patch(path)”以供重复使用?(单元测试)
- python - 如何获取包含下一个的链接?
- python - 用嵌套字典值替换 DataFrame 列
- wordpress - 内部服务器错误虚拟产品 WooCommerce
- nginx - Nginx 将静态路径 /v1 添加到所有前端 url
- reactjs - 是否有一个道具可以用来忽略缺少的强制道具类型警告?
- android - 是否可以在目标应用程序之外使用 detox 进行自动化测试?
- r - 尽管设置了选项 stringsAsFactors = F,为什么数据框不将字符串列设置为非因子?
- haskell - 如何在仆人处理程序中打印未捕获异常的堆栈跟踪?