将URL路由转换为函数参数php mvc

时间:2010-11-06 01:09:25

标签: php model-view-controller url-routing

我正在为PHP项目编写一个自定义MVC框架,在从URL路由获取参数之前,一切都很棒。我坚持将URL路由的一部分动态传递给函数参数。我已经有一个方法,只是为了破坏路由并使用数组作为函数参数,但我真的想知道如何在CodeIgnitor或CakePHP中做到这一点。

这就是我想要做的。网站网址将是......

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
    }

}

?>

我真的很想知道这是怎么做到的。非常感谢!

3 个答案:

答案 0 :(得分:6)

处理此问题的最简单方法是使用call_user_func_array()函数。您可以按如下方式使用它:

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

$ controller将是您已经创建的控制器对象,$ method将是控制器的方法。然后$ params是从URI收集的参数数组。您只需要取出URI的控制器/方法部分。

您也可以使用Reflection执行此操作,但这通常比使用上述方法慢。

答案 1 :(得分: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
    }

}

?>

感谢您的帮助。

答案 2 :(得分:1)

简单地说,RewriteRules处理这个问题。但是,在每个框架中都有更复杂的路由代码,可以将请求和数据定向到特定的Controller。

我的建议是查看这些其他框架中的代码,并研究它们如何解决这些问题。你提到的那些是开源的。