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

添加自定义动态SEO URL时出现frontend.faq.category路由未找到错误求助

自定义动态SEO URL生成失败,报错Route by name frontend.faq.category not found

尝试添加自定义动态SEO URL时,后台保存实体弹出错误提示:Route by name frontend.faq.category not found,实体保存成功但SEO URL未生成。以下是相关代码实现及问题排查修复方案:


相关代码实现

自定义控制器代码

/**
 * @RouteScope(scopes={"storefront"})
 * @Route("/faq/category/{faqCategoryId}", name="frontend.faq.category", methods={"GET"}, defaults={"XmlHttpRequest": true})
 */

Routes.xml

<?xml version="1.0" encoding="UTF-8" ?>

<routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing
        http://symfony.com/schema/routing/routing-1.0.xsd">

    <import resource="../../Storefront/Controller/*Controller.php" type="annotation" />
</routes>

Subscriber代码

class FAQCategorySubscriber implements EventSubscriberInterface
{
    private SeoUrlUpdater $seoUrlUpdater;

    public function __construct(SeoUrlUpdater $seoUrlUpdater) {
        $this->seoUrlUpdater = $seoUrlUpdater;
    }

    public static function getSubscribedEvents(): array
    {
        return [
            'faq_category.written' => 'onEntityWritten'
        ];
    }

    public function onEntityWritten(EntityWrittenEvent $event): void
    {
        $this->seoUrlUpdater->update(FAQCategoryPageSeoUrlRoute::ROUTE_NAME, $event->getIds());
    }
}

SeoUrlRoute代码

class FAQCategoryPageSeoUrlRoute implements SeoUrlRouteInterface
{
    public const ROUTE_NAME = 'frontend.faq.category';
    public const DEFAULT_TEMPLATE = '{{ faq.category.name }}';

    private FAQCategoryDefinition $faqCategoryDefinition;

    public function __construct(FAQCategoryDefinition $faqCategoryDefinition)
    {
        $this->faqCategoryDefinition = $faqCategoryDefinition;
    }

    public function getConfig(): SeoUrlRouteConfig
    {
        return new SeoUrlRouteConfig(
            $this->faqCategoryDefinition,
            self::ROUTE_NAME,
            self::DEFAULT_TEMPLATE,
            true
        );
    }

    public function prepareCriteria(Criteria $criteria): void
    {
    }

    public function getMapping(Entity $faqcategory, ?SalesChannelEntity $salesChannel): SeoUrlMapping
    {
        if (!$faqcategory instanceof FAQCategoryEntity) {
            throw new InvalidArgumentException('Expected FAQCategoryEntity');
        }

        $faqcategoryJson = $faqcategory->jsonSerialize();

        return new SeoUrlMapping(
            $faqcategory,
            ['faqCategoryId' => $faqcategory->getId()],
            [
                'faqcategory' => $faqcategoryJson,
            ]
        );
    }
}

问题排查与修复方案

1. 路由未在admin上下文注册

SeoUrlUpdater运行在admin后台环境,但你的控制器仅标记了storefront作用域,导致admin无法识别该路由。需修改控制器的@RouteScope,添加admin作用域:

/**
 * @RouteScope(scopes={"storefront", "admin"})
 * @Route("/faq/category/{faqCategoryId}", name="frontend.faq.category", methods={"GET"}, defaults={"XmlHttpRequest": true})
 */

2. SEO路由未正确注册为服务

确保FAQCategoryPageSeoUrlRoute被注册为Symfony服务并添加seo.route标签,在services.yaml中配置:

services:
  YourNamespace\FAQCategoryPageSeoUrlRoute:
    arguments:
      - '@YourNamespace\FAQCategoryDefinition'
    tags:
      - name: seo.route

3. SEO URL模板变量不匹配

DEFAULT_TEMPLATE使用{{ faq.category.name }},但getMapping中传递的变量是faqcategory,变量名不匹配会导致生成失败。二选一修改:

  • 方案一:修改模板变量
public const DEFAULT_TEMPLATE = '{{ faqcategory.name }}';
  • 方案二:调整getMapping中的变量结构
return new SeoUrlMapping(
    $faqcategory,
    ['faqCategoryId' => $faqcategory->getId()],
    [
        'faq' => [
            'category' => $faqcategoryJson
        ],
    ]
);

4. 清理路由缓存

执行缓存清理命令,确保路由配置生效:

bin/console cache:clear
bin/console system:cache:clear

内容的提问来源于stack exchange,提问作者Jacky Raimond

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:15:29