我不知道我是否正确使用了“路由”一词,但情况如下:
我创建了一个.htaccess
文件来“处理”(如果我的术语是正确的,不知道)我的应用程序的 url,如下所示:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
现在我有这个:
http://appname/controller/method/parameter
http://appname/$url[0]/$url[1]/$url[2]
我所做的是:
- 设置默认控制器,以防在 url 中未指定
- 设置一个控制器包装器
我是这样做的
$target = new $url[0]()
$controller = new Controller($target)
那个问题是我不能使用我在控制器的构造函数中传递的对象中的方法:
我是这样解决的:
class Controller {
protected $target;
protected $view;
public function __construct($target, $view) {
$this->target = $target;
$this->view = $view;
}
public function __call($method, $arguments) {
if (method_exists($this->target, $method)) {
return call_user_func_array(array($this->target, $method), $arguments);
}
}
}
这工作正常,问题出现在我进行路由的索引中,这里是
if(isset($url[2])){
if(method_exists($controller, $url[1])){
$controller->$url[1]($url[2])
}
} else {
if(method_exists($controller, $url[1])){
$controller->$url[1]()
}
}
在哪里$controller = new Controller($target)
问题是方法不存在,虽然我可以直接使用它而不检查方法是否存在,我该如何解决这个问题?