如何在Symfony2服务中获取当前相对URL?

时间:2014-04-07 20:31:17

标签: php symfony

就像标题所说的那么简单。我的意思是,我的意思是如何获取当前的相对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

当然,这仍然不理想。

那么,我怎样才能获得我在这里寻找的所有东西,可靠

4 个答案:

答案 0 :(得分:6)

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

$request->getRequestUri();

它正是我正在寻找的东西。

答案 1 :(得分: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'];

希望它可以帮助你

答案 2 :(得分:0)

了解你的动机会很有用。如果您绝对需要获取脚本名称,则可以使用$_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路由,则可以使用{{1}但是你必须使用一些操作来摆脱基本URL和子目录(引导程序所在的位置。)

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

$_SERVER['REQUEST_URI']

答案 3 :(得分:0)

可以使用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();

}

}
相关问题