簡體   English   中英

如何在Symfony2服務中獲取當前相對URL?

[英]How to get current relative URL in Symfony2 service?

就像標題所說的那么簡單。 我的意思是我如何得到當前的相對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

當然,這仍然不理想。

那么,我怎樣才能可靠地獲取我在這里尋找的所有東西呢?

這實際上比我想象的要簡單得多。 我必須使用的是:

$request->getRequestUri();

它會返回我正在尋找的東西。

您可以查看Symfony環境是什么,如@sjagr所說; 但如果您仍然需要獲取完整路徑的部分而不檢查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'];

希望它能幫到你

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

}

}

了解你的動機會很有用。 如果您絕對需要獲取腳本名稱,則可以使用$_SERVER超全局: $_SERVER['SCRIPT_NAME'] ,它將為您提供引導程序文件的相對路徑(在本例中為/path/to/app_dev.php 。你可以使用字符串操作來獲取最后一部分。

但是你會注意到app_dev.phpapp.php不同,因為這行:

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

您可以輕松檢查Symfony是否在開發環境中 ,它會告訴您實際上正在使用app_dev.php

如果要檢查請求URI以查看最終用戶是否正在嘗試直接訪問引導程序而不是通過.htaccess路由,則可以使用$_SERVER['REQUEST_URI']但是您必須使用某些操作來擺脫基本URL和子目錄(引導程序所在的位置。)

獲得所有內容的組合(快速代碼,如果有任何錯誤或不良做法,請原諒我):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM