【问题标题】:Matching a URL to a route in Symfony将 URL 与 Symfony 中的路由匹配
【发布时间】:2014-11-16 12:26:30
【问题描述】:

我们在身份验证后面有文件,如果用户使用文件的 URL 和 HTML 资源的 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 有一个路由组件 (http://symfony.com/doc/current/book/routing.html),我正在尝试在 Symfony IOC 提供的Symfony\Bundle\FrameworkBundle\Routing\Router 实例上调用match()。我尝试过使用域和不使用域,但它们都创建了 MethodNotAllowed 异常,因为找不到路由。如何将此 URL 与路由匹配?

【问题讨论】:

    标签: symfony url-routing


    【解决方案1】:

    也许有点晚了,但由于我遇到了同样的问题,所以我遇到了类似的情况

    $request = Request::create($targetPath, Request::METHOD_GET, [], [], [], $_SERVER);
    
    try {
        $matches = $router->matchRequest($request);
    } catch (\Exception $e) {
        // throw a 400
    }
    

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

    【讨论】:

      【解决方案2】:

      根据this,Symfony 在匹配时使用current 请求的HTTP 方法。我猜你的控制器服务于 POST 请求,而你的下载链接是 GET。

      【讨论】:

      • 谢谢。这可能是我最终要做的,但它不适用于不同的请求类型。
      【解决方案3】:

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

      【讨论】:

      • 感谢您的意见。当前请求不是我想要路由的请求。我想获取任意 URL 的路由。
      【解决方案4】:

      你可以做这样的事情来获取路线名称:

      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,然后尝试使用路由匹配器将路径的剩余部分与已知的路由模式匹配。

      EDIT2: 显然,如果你想能够使用$this->get(...)

      ,你需要在你的控制器里面有这个

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-22
        • 1970-01-01
        • 2019-11-20
        • 2021-01-21
        • 2020-04-25
        • 2014-01-01
        • 2014-10-03
        • 2020-10-31
        相关资源
        最近更新 更多