题
我正在写一个“全部抓住”我的控制器为ajax的方法。它被称为'ajax':P
这就是目前的样子
public function ajax($method = null) {
if ( ! $method OR ! request::is_ajax()) {
return false;
}
if (method_exists(array($this, 'searchModel'), $method)) {
echo $this->searchModel->$method();
}
exit;
}
如果不明显,我希望ajax首先纾困,如果它认为它不是Ajax请求,然后检查我的 $ this-> searchModel
以查看它是否有一个作为ajax方法的论证传入的方法。
如果确实找到了该方法,它应该回显它的返回值,然后退出。
我的问题是我无法获取 method_exists()
来查找方法!我知道它确实存在...我甚至硬编码(用于测试目的)我知道的方法确实存在。
这让我有点疯狂,是否有人能够告诉我我做错了什么?
谢谢!
P.S。我正在使用Kohana框架,但我认为这不重要。
<强>更新强>
您认为将我的内部方法名称暴露给JavaScript(即公开)可能会引起安全问题吗?
解决方案
您正在使用 method_exists()
的第一个参数,就像它支持回调参数一样,但它不接受回调。它只接受一个对象实例或一个类名(一个字符串)来测试静态方法。
试试这个:
if (method_exists($this->searchModel, $method)) {
echo $this->searchModel->$method();
}
回答你的第二个问题,是的,我认为这是一个安全问题。您尚未确认请求格式正确。我不会使用“全能”你正在设计的解决方案。
其他提示
我认为您的代码应该说:
if(method_exists($this->searchModel, $method))
echo $this->searchModel->$method();
然而, 将searchModel对象的所有方法暴露给世界是一个坏主意,所以你应该在ajax方法前加上' ajax _
'或者其他东西类似,以便只能调用具有该前缀的方法:
// given that $method is 'user_login' ...
$realMethod = 'ajax_' . $method;
if(method_exists($this->searchModel, $realMethod))
// calls $this->searchModel->ajax_user_login();
echo $this->searchModel->$realMethod();
不隶属于 StackOverflow