Помогите с PHP method_exists () - PullRequest
       15

Помогите с PHP method_exists ()

2 голосов
/ 15 сентября 2009

Я пишу метод «поймать все» для моего контроллера для 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, но я не думаю, что это должно иметь значение.

UPDATE

Считаете ли вы, что раскрытие имен моих внутренних методов в JavaScript (т. Е. Общедоступных) может быть проблемой безопасности?

Ответы [ 2 ]

4 голосов
/ 15 сентября 2009

Вы используете первый аргумент для method_exists(), как будто он поддерживает аргумент обратного вызова, но не принимает обратный вызов. Он принимает только экземпляр объекта или имя класса (строку) для тестирования статических методов.

Попробуйте это:

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

По вашему второму вопросу, да, я думаю, это проблема безопасности. Вы не проверили правильность запроса. Я бы не стал использовать «всеобъемлющее» решение, которое вы разрабатываете.

2 голосов
/ 15 сентября 2009

Я думаю, что ваш код должен сказать:

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();
...