4

我已經構建了一個符合PHP中mvc模式的系統。控制器和操作是我應用程序中的url的一部分。所以,我有:以mvc模式傳遞變量

www.example.com/controller/action/

所以現在我正在尋找一種方式來傳遞變量。對於表單,我只是使用post方法,但有時我只想鏈接到不同的頁面,然後傳遞一些變量。

我想就如何做到這一點的一些建議。我知道在控制器中使用「/」字符作爲分隔符後,Zend Framework具有變量作爲鍵/值對,如下所示:

www.example.com/controller/action/var1/value1/ var2/value2

這是最好的方法嗎?這實際上是我知道它完成的唯一方法。 我正在尋找一種簡單但實用的好方法。

歡迎任何建議。

回答

1

您可以選擇通過GET或POST傳遞變量。

GET將變量追加到URL,無論是在漂亮的格式

/controller/action/var1/value1/var2/value2 

或傳統方式

/controller/action/?var1=value1&var2=value2 

在前一種情況下,你仍然需要編寫一個Apache重寫規則從URL中提取變量,並使用正確的一組變量作爲$ _REQUEST的一部分路由到控制器/操作。

如果您使用的是POST,您可以將隱藏值添加到每個表單中以作爲傳遞變量的一種方式。

對於您不想公開的變量,您可以使用Sessions將它們存儲在服務器端。

1

你也可以做得到查詢,像這樣:

www.site.com/controller/action?var1=value1 & VAR2 =數值

這些將在$ _GET超全局露面。

3

var1/value1/var2/value2真的不是最好的辦法,它濫用MVC controller/action/id結構。要麼你需要重新考慮你的設計,使用POST或查詢參數。最有可能的,你可以重新設計,例如,如果你有

/search/type/movie/format/divx/year/2000 

你可以重做,作爲

/movie/divx?year=2000 

所以你movie控制器將搜索divx格式的電影,然後也許使用一個輔助或過濾器或客戶端腳本只顯示匹配年== 2000的電影。

+0

我不會完全調用controller/action/id restful。 – troelskn 2009-04-13 22:23:40

4

框架,如笨,讓你通過變量到控制器沒有透露變量名 -

/controller/action/foo/bar/ 

如將得到處理:

function action($id, $value){ 
    echo $id; // outputs 'foo' 
    echo $value; // outputs 'bar' 
} 

http://codeigniter.com/user_guide/general/controllers.html

我喜歡這個,因爲它可以控制控制器可以接受多少個參數,並且如果從不使用某些變量很重要,則可以執行邏輯或適當重定向。

1

根據您的項目,您也可以嘗試使用PHP會話設置和讀取值。這些值不必作爲GET或POST值從腳本傳遞到腳本。一個不利的方面是,變量不能簡單地作爲URL(或書籤)的一部分傳遞。

1

我會避免你之前提到的關鍵/值Zend風格的方法。問題在於創建兩個不同的URL變得微不足道:

http://www.example.com/controller/action/var1/value1/var2/value2 
http://www.example.com/controller/action/var2/value2/var1/value1 

指向相同的資源。雖然這是有效的,但是MVC樣式框架在Web應用程序中的成功部分在於,它可以更輕鬆地提供乾淨的URL結構,並將網站上的單個URL與每個資源相關聯。與鍵/值查詢字符串相比,var1/value1/var2/value2方法幾乎沒有什麼優勢。

我會拿這裏的方法是避開鍵,僅僅只是用值

http://www.example.com/example/list/value1/value2/value3 

將被傳遞到操作方法作爲數組

class example extends Controller{ 
    public function list($args){ 
     //$args[0] = 'value1'; 
     //$args[1] = 'value2';  
     //$args[2] = 'value3';    
    } 
} 

通過做這個方式,你可以讓系統的最終用戶決定他們想要如何處理$ GET樣式變量,同時鼓勵設計導致更清潔,更穩定的單一資源URL。

1

我喜歡在我的CakePHP項目中使用的是「命名參數」。基本上,我的網址是這樣的:

http://example.com/controller/action/param1:value1/param2:value2 

你可以看到在Cake's manual一些例子。我不知道你的框架是否支持這個(或者Zend),但是如果麪包師這樣做了,它可以完成。 :-)