Помощь с PHP method_exists()
Вопрос
Я пишу метод "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();