就像标题所说的那么简单。我的意思是,我的意思是如何获取当前的相对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
当然,这仍然不理想。
那么,我怎样才能获得我在这里寻找的所有东西,可靠?
答案 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.php
与app.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();
}
}