2009-09-15 1 views
2

Я пишу метод «поймать все» для моего контроллера для ajax. Это называется «Аяксом»: PПомощь с PHP method_exists()

Это то, что в настоящее время он выглядит как

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 , а затем, проверьте мой $this->searchModel, чтобы узнать, есть ли у него метод, который был передан как аргумент метода ajax.

Если он найдет метод, он должен повторить его возвращаемое значение, а затем выйти.

Моя проблема: я не могу получить method_exists(), чтобы найти способ! Я знаю, что он существует ... Я даже сильно закодировал (для целей тестирования) методы, которые, как я знаю, существуют.

Это заставило меня немного сумасшедшим, может ли кто-нибудь сказать мне, что я делаю неправильно?

Спасибо!

P.S. Я использую структуру Kohana, но я не думаю, что это должно иметь значение.

UPDATE

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

ответ

4

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

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

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

Re второго вопроса, да, я думаю, что это проблема безопасности. Вы не подтвердили правильность формирования запроса. Я бы не использовал разработанное вами решение «все-поймать».

+1

Thanks Bill! Если бы я сделал что-то вроде этого, вы думаете, что это сделает его безопасным '$ method = 'ajax_'. $ method' .i.e. Префикс 'ajax_' гарантирует, что они не смогут получить доступ к каким-либо другим методам моей модели? – alex

+0

На самом деле я больше беспокоился о вредоносных запросах, которые * do * вызывают методы ajax, а не запросы, которые вызывают методы, отличные от ajax. –

+0

Ну, эта модель касается только запросов пользователей - она ​​должна быть безопасной. – alex

2

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

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

Однако это плохая идея раскрыть все методы вашего объекта searchModel в мире, так что вы должны префикс Аякса методы с '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(); 
+0

Вы читаете мой разум с префиксом! Спасибо за Ваш ответ. – alex

 Смежные вопросы

  • Нет связанных вопросов^_^