2010-11-06 35 views
3

我正在爲一個PHP項目編寫一個自定義MVC框架,並且一切都很好,直到從URL路徑獲取參數。我堅持將URL路由的一部分動態地傳遞給函數參數。我已經有一個方法,它只是將路線內爆並將該數組用於函數參數,但我真的很想知道如何在CodeIgnitor或CakePHP中執行此操作。將URL路由轉換爲函數參數php mvc

這就是我想要做的。該網站網址是...

url: http://yoursite.com/profile/view/35/foo 

,並在我的控制器我會......

<?php 

Class profileController Extends baseController 
{ 

    public function view($ID, $blah) 
    { 
     echo $ID; //would show 35 
     echo $blah; //would show foo 
    } 

} 

?> 

我真的想知道如何做到這一點。非常感謝!

回答

4

處理此問題的最簡單方法是使用call_user_func_array()函數。你會像下面這樣使用它:

call_user_func_array(array($controller, $method), $params); 

$控制器將是你已經創建控制器對象和$方法是控制器的方法。然後$ params是從URI收集的參數數組。您只需要取出URI的控制器/方法部分。

您也可以使用Reflection來做到這一點,但這通常比使用上述方法要慢。

+0

非常感謝你,我正在做一些研究,並且我發現了call_user_func_array,它完美地工作。再次感謝! – 2010-11-06 03:10:37

+0

感謝您的回答。 – Karma 2012-12-25 10:05:24

1

簡單地說,RewriteRules處理這個。然而,在每個框架內,更復雜的路由代碼將請求和數據引導至特定的控制器。

我的建議是查看這些其他框架中的代碼並研究它們如何解決這些問題。你提到的那些是開源的。

+0

我在.htaccess文件中有一個mod_rewrite,它可以「屏蔽」$ rt變量。我可以通過$ route [0],$ route [1]等來訪問URL的路由。我想我真正的問題是如何將URL部分的數組轉換爲我上面的格式的函數參數。我已經看過codeigniter和cakePHP以及另一個框架,但我似乎無法找到創建這些參數變量的代碼。 – 2010-11-06 02:13:08

3

誰想要知道我落得這樣做,最終的代碼如下......(這是從我的router.class.php)

<?php 

$route = (empty($_GET['rt'])) ? '' : $_GET['rt']; 
$this->route = explode('/', $route); 

/*** a new controller class instance ***/ 
$class = $this->controller . 'Controller'; 
$controller = new $class($this->registry); 

/*** load arguments for action ***/ 
$arguments = array(); 
foreach ($this->route as $key => $val) 
{ 
    if ($key == 0 || $key == 1) 
    { 
    } 
    else 
    { 
     $arguments[$key] = $val; 
    } 
} 

/*** execute controller action w/ parameters ***/ 
call_user_func_array(array($controller, $action), $arguments); 

?> 

如果我的網址是

http://mysite.com/documentation/article/3 

我的控制器看起來像這樣...

<?php 

Class documentationController Extends baseController 
{ 

    public function article($article_ID = '') 
    { 
     echo $article_ID; //shows 3 
    } 

} 

?> 

感謝您的幫助。

+0

我喜歡你的答案的簡單性,但我不知道如何把它放在一起。例如,我把你的代碼放到我的index.php中,我正在生成一個baseController,找不到那個類。你能多解釋一下嗎? – Iannazzi 2015-09-12 08:08:45