添加自定义动态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
相关产品推荐
相关产品推荐

