【问题标题】:Symfony2 get path info of URL explicitelySymfony2 明确获取 URL 的路径信息
【发布时间】:2015-12-24 19:54:25
【问题描述】:

假设,我有一个 URL http://server/mysite/web/app_dev.php/resource/1。 我正在做一个GET 请求,对应的操作是ResourceController::getAction

在这个控制器动作中,如果我调用$request->getPathInfo(),它会给我/resource/1

但是在同一个控制器中,如果我使用另一个资源的 url 创建一个 Request 对象并调用 getPathInfo() 它会返回一个更长的版本。

$request = Request::create('http://server/mysite/web/app_dev.php/another_resource/1');
echo $request->getPathInfo();

OUTPUT >>
/mysite/web/app_dev.php/another_resource/1

在这种情况下,如何让getPathInfo() 只返回/another_resource/1

任何人都可以建议在 Symfony2 中将端点 URL http://server/mysite/web/app_dev.php/another_resource/1 转换为 /another_resource/1 的最安全方法是什么?

如果你有兴趣知道我为什么需要这个

控制器操作正在接收请求内容中的一些 URL。该操作需要解析这些 URL 以识别相应的资源。我正在尝试使用 $router->match 函数从 URL 中检索参数。 match 函数只需要 /another_resource/1 部分。

【问题讨论】:

  • 您可以尝试使用 $request->getBaseUrl(); 从当前的 Request 对象中获取基本 url,并将其与 str_replace 一起使用,然后将其替换为由 @987654337 返回的空字符串@。这是一个有点hacky的方式。我可以稍后写一个答案,为什么在使用 ::create() 时会得到不同的输出。
  • 谢谢@Artamaiel。这种方式只要baseurl不变,肯定能解决问题。但是,即使将基本 url 更改为 app.phpapp_dev.php 等,我仍然会寻找其他可以工作的东西。我真的很想忘记 baseurl 部分。目前,我计划为所有端点添加一个前缀,我的 url 解析器服务将按该前缀拆分 url。通过这种方式,我将去掉不需要的部分。也不是那么优雅的解决方案,但至少通过这种方法,我根本不需要担心baseurl 部分。
  • I could write an answer later why you get a different output when using ::create(),请做。在这种情况下知道这肯定是一件有用的事情。

标签: php symfony pathinfo


【解决方案1】:

Request::create 方法创建一个不知道有关当前请求的任何信息的新请求,它返回完整的 uri,因为它不知道当前的脚本文件。 试试:

$request = Request::create('http://server/mysite/web/app_dev.php/another_resource/1', null, array(), array(), array(), array(
    'SCRIPT_NAME' => $this->get('kernel')->getEnvironment() == 'dev' ? 'app_dev.php' : 'app.php',
    'SCRIPT_FILENAME' => $this->get('kernel')->getEnvironment() == 'dev' ? 'app_dev.php' : 'app.php',
));
echo $request->getPathInfo();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-13
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多