【问题标题】:How to get current relative URL in Symfony2 service?如何在 Symfony2 服务中获取当前的相对 URL?
【发布时间】:2014-04-07 20:31:16
【问题描述】:

就像标题所说的那样简单。我真正的意思是如何获得当前的相对 URL,包括文件名如果有一个,即下面强调的所有内容:

http://hostname/app/app_dev.php/path/to/some/action?even=a%20query%20string
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

现在,如果您不需要该文件,这很容易,您可以获取 RequestStack,获取当前请求并在服务中使用类似这样的内容:

$request->getPathInfo();

但在我当前在这个问题中的示例中,会带回以下内容:

/path/to/some/action?even=a%20query%20string

没有 /app_dev.php,这对我来说是目前很重要的部分。我已经用尽的另一种选择是使用路由器来生成当前路由,它在某些方面确实工作得很好,它确实显示了文件名,但是如果查询字符串的某些部分不是'路由中定义的 t 包含在当前请求中,那么它不会显示在结果中。

所以,让我们在上面的示例中再次假设 even 查询字符串未包含在路由中,我无法生成它,并且此方法只会返回如下内容:

/app_dev.php/path/to/some/action

当然,这仍然不理想。

那么,我怎样才能在此处可靠地获得我正在寻找的一切?

【问题讨论】:

    标签: php symfony


    【解决方案1】:

    这实际上比我想象的要简单得多。我只需要使用:

    $request->getRequestUri();
    

    它返回的正是我想要的。

    【讨论】:

    • 在一个服务中,$request 是从哪里来的?
    • 您必须将@request_stack 服务注入您自己的服务并从中获取当前请求。
    • 感谢@Seer 的及时回复。我看到我们也可以注入@Router 并使用generate() 方法。但我确实喜欢request_stack
    【解决方案2】:

    可以使用RequestStack,我在服务中使用了这种方式

    只需注入request_stack,其行为与任何普通服务一样。

    class ExServ {
    
    
        private $requestStack;
    
        public function __construct($requestStack) {
    
            $this->requestStack = $requestStack;
    
        }
    
        public function tesFun() {
    
    
            $relativeURL = $this->requestStack->getMasterRequest()->getRequestUri();
    $absoluteURL = $this->requestStack->getMasterRequest()->getUri();
    
    }
    
    }
    

    【讨论】:

      【解决方案3】:

      您可以检查 @sjagr 所说的 Symfony 环境是什么;但是如果您仍然需要在不检查 Symfony 环境的情况下获取完整路径部分,您可以执行以下操作:

      //After you send RequestStack to your service and assume you assign it to $this->request
      $url = $this->Request->getUri();
      $pieces = parse_url($url);
      $looking_for_section = substr($pieces['path'], strrpos(strstr($pieces['path'], '.', true), '/')) . $pieces['query'];
      

      希望对你有帮助

      【讨论】:

      • 这与我最终实际使用的非常接近。虽然我的解决方案有点简单。可以只使用$request->getRequestUri() 来获得我想要的东西。赞成,因为它可以工作并且可靠。
      【解决方案4】:

      了解你的动机会很有用。如果您绝对需要获取脚本名称,您可以使用$_SERVER 超全局:$_SERVER['SCRIPT_NAME'],它将为您提供引导文件的相对路径(在本例中为/path/to/app_dev.php。)您可以使用字符串操作来只获取最后一部分。

      但您会注意到 app_dev.phpapp.php 不同,因为这行:

      $kernel = new AppKernel('dev', true);
      

      您可以轻松地check to see if Symfony is in the dev environment,这会告诉您您实际上正在使用app_dev.php

      如果您想检查 请求 URI 以查看最终用户是否尝试直接访问引导程序而不是通过 .htaccess 路由,您可以使用 $_SERVER['REQUEST_URI'] 但您d 必须使用一些操作来摆脱基本 URL 和子目录(引导程序所在的位置。)

      获取一切的组合(快速代码,如果有任何错误或不良做法,请原谅我):

      $scriptPath = explode('/', $_SERVER['SCRIPT_NAME']);
      $relUrl = end($scriptPath).$_SERVER['PATH_INFO'].(!empty($_SERVER['QUERY_STRING']) ? '?'.$_SERVER['QUERY_STRING'] : '');
      

      【讨论】:

      • 我曾想过这种方法,但我想非常清楚地避免使用任何超级全局变量。此外,我不能可靠地使用 app_dev.php 文件的“dev”部分作为正在使用的文件的指示,因为我可以重命名文件,并且我可以在 app.php 中使用“dev”环境例如。
      猜你喜欢
      • 2012-06-18
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 2015-05-08
      • 2019-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多