Вопрос

Я пишу метод "catch all" для моего контроллера для 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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top