在Symfony中将URL与路由匹配

4
我们有一些需要登录才能访问的文件,并且如果用户使用文件的URL或HTML资源的URL进入应用程序,我想在认证后重定向到不同的页面。 我有一个URL:https://subdomain.domain.com/resource/45/identifiers/567/here/11abdf51e3d7-some%20file%20name.png/download。我想获取这个URL的路由名称。 运行app/console router:debug命令会输出以下内容:_route_name GET ANY subdomain.domain.{tld} /resource/{id2}/identifiers/{id2}/here/{id3}/download。Symfony有一个Routing组件(http://symfony.com/doc/current/book/routing.html),我试图在Symfony IOC提供的Symfony\Bundle\FrameworkBundle\Routing\Router实例上调用match()方法来匹配该URL与路由。我尝试过带有域名和不带域名的方式,但它们都会创建一个MethodNotAllowed异常,因为找不到路由。如何将此URL与路由匹配?
4个回答

2
也许有点晚了,但我遇到了同样的问题,我得出的解决方案是类似于:
$request = Request::create($targetPath, Request::METHOD_GET, [], [], [], $_SERVER);

try {
    $matches = $router->matchRequest($request);
} catch (\Exception $e) {
    // throw a 400
}

关键部分是使用$_SERVER超全局数组,以便立即设置所有内容。

1
根据this,Symfony在匹配过程中使用当前请求的HTTP方法。我猜您的控制器提供POST请求,而您的下载链接是GET。

谢谢这个建议。这也许是我最终会采取的方法,但它不适用于不同类型的请求。 - sennett

0

你可以像这样获取路由名称:

public/protected/private function getRefererRoute(Request $request = null)
{
    if ($request == null)
        $request = $this->getRequest();

    //look for the referer route
    $referer = $request->headers->get('referer');
    $path = substr($referer, strpos($referer, $request->getBaseUrl()));
    $path = str_replace($request->getBaseUrl(), '', $lastPath);

    $matcher = $this->get('router')->getMatcher();
    $parameters = $matcher->match($path);
    $route = $parameters['_route'];

    return $route;
}
编辑: 我忘记解释我在做什么了。基本上,你获取页面的URL($referer),然后使用str_replace去掉你的网站基本URL,然后尝试使用路由匹配器将剩余部分与已知的路由模式进行匹配。 编辑2: 显然,如果你想能够使用$this->get(...),你需要将这段代码放在你的控制器中。

0

路由名称可以在Request对象的_route_name属性中找到:$request->attributes->get('_route_name')


2
感谢您的输入。当前请求不是我想要路由的请求。我想获取任意 URL 的路由。 - sennett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接