2

我正在为我的 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()找不到方法!我知道它确实存在......我什至硬编码(用于测试目的)我知道肯定存在的方法。

这让我有点发疯,有人能告诉我我做错了什么吗?

谢谢!

PS 我正在使用 Kohana 框架,但我认为这无关紧要。

更新

您认为将我的内部方法名称暴露给 JavaScript(即公共)可能会引起安全问题吗?

4

2 回答 2

4

您正在使用第一个参数,method_exists()就好像它支持回调参数一样,但它不接受回调。它只接受一个对象实例或一个类名(一个字符串)来测试静态方法。

试试这个:

if (method_exists($this->searchModel, $method)) {
    echo $this->searchModel->$method();
}

关于你的第二个问题,是的,我认为这是一个安全问题。您没有验证请求是否格式正确。我不会使用您正在设计的“包罗万象”的解决方案。

于 2009-09-15T00:58:14.783 回答
2

我认为您的代码应该说:

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();
于 2009-09-15T00:59:33.690 回答