我正在为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
}
}
?>
我真的很想知道这是怎么做到的。非常感谢!
答案 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。
我的建议是查看这些其他框架中的代码,并研究它们如何解决这些问题。你提到的那些是开源的。