如何让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
相关产品推荐
相关产品推荐

