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

如何让Symfony 6动态路由匹配含问号的URL?

Symfony迁移中带问号的旧URL路由匹配问题

我正在把旧网站迁移到Symfony框架,要求保留原有URL地址,因此将这些URL存入数据库并编写了自定义动态路由加载器DynamicRouteLoader。但部分URL包含问号,Symfony会将问号后的内容视为参数而忽略,导致路由匹配失败。例如访问http://web.local/page.asp?lang=sk时,会出现错误提示:No route found for "GET http://web.local/page.asp"。我目前想到的解决办法是通过.htaccess将问号替换为下划线。

以下是当前DynamicRouteLoader的代码:

namespace App\RouteLoader;

use Doctrine\ORM\EntityManagerInterface;
use RuntimeException;
use Symfony\Component\Config\Loader\Loader;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
use App\Entity\Route as CustomRoute;

class DynamicRouteLoader extends Loader
{
    private EntityManagerInterface $entityManager;
    private bool $loaded = false;

    public function __construct(EntityManagerInterface $entityManager)
    {
        parent::__construct();
        $this->entityManager = $entityManager;
    }

    public function load($resource, $type = null): RouteCollection
    {
        if ($this->loaded) {
            throw new RuntimeException('Dynamic routes are already loaded.');
        }

        $routesCollection = new RouteCollection;

        /** @var CustomRoute[] $routes */
        $routes = $this->entityManager->getRepository(CustomRoute::class)->findAll();

        foreach ($routes as $route) {
            foreach (['cs', 'sk', 'en', 'de', 'ru'] as $lang) {
                $path = $route->getUrl($lang);
                $defaults = [
                    '_controller' => 'App\Controller\\' . $route->getController() . 'Controller::' . $route->getAction(),
                    '_locale' => $lang,
                ];
                $name = strtolower($route->getController()) . '_' . $route->getAction();
                if ($route->getParameters() !== null) {
                    $defaults['id'] = $route->getParameters();
                    $name .= '_' . $route->getParameters();
                }
                $name .= '_' . $lang;
                $routesCollection->add($name, new Route($path, $defaults));
            }
        }

        $this->loaded = true;

        return $routesCollection;
    }

    public function supports($resource, $type = null): bool
    {
        return $type === 'dynamic';
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:15:16