2012-07-16 121 views
1

我看遍了各地,但仍然無法弄清楚如何在PHP(鋰框架)中設置全局變量。鋰PHP全局變量

我的目標是使服務器的根始終可以訪問無處不在,而無需編寫代碼,每次,使獨立的主機名是我的應用程序正在運行上:

<?php echo "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; ?> 

請不要告訴我只是使用絕對路徑或相對路徑,因爲我已經嘗試了所有這些方法,而且它太雜亂了(除了大部分時間不工作)。

+0

自定義超全局圖在PHP中是不可能的(無論如何,不​​是沒有[runkit](http://www.php.net/manual/en/runkit.configuration.php))。作爲一個解決方案,我通常會開始一個會話(不管我是否真的需要一個會話),因此您可以將數據寫入'$ _SESSION'數組(注意請求併發漏洞,請始終使用['session_write_close()'](http:/ /php.net/manual/en/function.session-write-close.php)在每個腳本儘可能的機會)。我也看到有人使用'$ _ENV',但它不是爲此目的而設計的,因此不推薦使用--YMMV。 – DaveRandom 2012-07-16 15:40:43

+0

我相信這應該在鋰框架的boostrap部分中完成,以便每次有人請求頁面時都不會執行代碼。只有在第一次請求時才計算值......仍然在等待答案,也許只是堅持使用runkit。 – 2012-07-16 15:54:09

+0

Runkit不可能在任何地方都可用(如果有的話)。如果您想在用戶第一次在網站上興奮時計算該值,那聽起來就像是會話的理想候選人。 – DaveRandom 2012-07-16 16:01:46

回答

3

它看起來像你的代碼在模板中。因此,您可以使用$this->request()->to('url')獲取當前網址。或者從一個控制器,它將是$this->request->to('url')。您還可以將'absolute' => true傳遞給Router::match的選項。不幸的是,html鏈接助手(即$this->html->link(...))未將'absolute' => true選項傳遞給Router::match,但您可以撥打$this->url()傳遞給Router::match。所以這將是$this->url('/relative/url', array('absolute' => true))

參見docs for Router::match

Request對象還提供了訪問之類的東西HTTP主機和請求URI。看到docs for Request::env()

但是,關於全球變量的原始觀點,我認爲Environment類應該用於此。您可以在其中放入任意數據 - 甚至可以將其設置在引導程序中,以針對不同的環境(即開發與分段與生產)具有不同的值。

+0

是的,這似乎是正確的方式來做到這一點,框架明智!非常感謝! – 2012-07-20 13:25:54

0

對不起,但使用相對路徑和使用鏈接生成器幫手,其中不會得到你想做的錯。

參見the docs

+1

並不總是如此。例如,RFC說明'Location:'標題應該總是包含完整的URL而不是相對路徑。大多數瀏覽器都會處理相對路徑,但由於它違反了標準,因此不應該依賴此行爲。 – DaveRandom 2012-07-16 15:44:26