2010-11-06 34 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