2010-12-18 95 views
7

我對cakephp相當陌生,但我有一個關於網址和參數的問題。我希望能有一個URL,它看起來像一個標準的URL例如:CakePHP,GET參數和路由

http://www.mysite.com/controller/myaction?arg=value&arg2=val 

我想這個URL映射到操作在我的控制器如下:

function myaction($arg = null, $arg2 = null) 
{ 
    // do work 
} 

我知道那cakephp的路由描述如here,但是,老實說,這似乎過度工程,並導致一個非標準的url字符串。

在我目前的情況下,網址是由一個對蛋糕一無所知並且不支持蛋糕url格式的外部(計費)系統生成和調用的。

回答

11

您可以使用任何形式的網址。這只是CakePHP允許從可變$this->params['url']

function myaction() 
{ 
    if(isset($this->params['url']['arg'])) 
    $arg = $this->params['url']['arg']; 
    if(isset($this->params['url']['arg2'])) 
    $arg2 = $this->params['url']['arg2']; 
} 
+0

1由於FO你的幫助陽光明媚! – Introgy 2010-12-18 19:18:45

+1

你打算說'isset',對吧? is_set不是一個php函數。 – 2014-08-06 15:03:59

0

我有一個類似的問題檢索通過GET傳遞的變量。不是因爲我有一個外部系統,而是因爲我不喜歡將所有參數放入URL路徑中。在我的例子中,我有一些搜索查詢被彙編並傳遞給控制器​​。恕我直言,這些查詢應該是GET參數,而不是URL路徑的一部分。

使用GET參數的一個優點是,與通過URL路徑傳遞參數相比,給定參數的順序並不重要。

了一般的方法解決這個問題,我用GET-參數的時值替換所有方法的參數,如果一個具有相同名稱給出:

class MyController extends AppController 
{ 
    function test($var1 = null, $var2 = "content2") 
    { 
     foreach (get_defined_vars() as $key => $value) { 
      if (isset($this->params['url'][$key])) { 
       $getvalue = $this->params['url'][$key]; 
       $$key = $getvalue; 
       CakeLog::write("debug", "Setting:$key to $getvalue"); 
      } 
     } 
     CakeLog::write("debug", print_r(get_defined_vars(), true)); 
    } 
} 

現在我可以訪問此控制器的方法和通過GET傳遞參數是這樣的:

http://myapp/mycontroller/test?var1=foo&var2=bar 
1

解在AppController的用於CakePHP的2.x的

class AppController extends Controller { 

.... 

/*** 
    * Recupera los Named envias por URL 
    * si es null $key emtraga el array completo de named 
    * 
    * @param String $key 
    * 
    * @return mixed 
    */ 
    protected function getNamed($key=null){ 
     // Is null..? 
     if(is_string($key)==true){ 
      // get key in array 
      return Hash::get($this->request->param('named'), $key); 
     }else{ 
      // all key in array 
      return $this->request->param('named'); 
     } 
    } 
... 
}