Pergunta

Eu estou escrevendo um "catch all" método para o meu controlador para ajax. Ele é chamado de 'ajax': P

Isto é o que actualmente parece

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;



}

No caso em que não é óbvio, eu quero o ajax primeiro fiança se ele acha que não é uma solicitação do Ajax, e em seguida, verificar o meu $this->searchModel para ver se ele tem o método que foi passado como argumento do método de ajax .

Se isso acontecer encontrar o método, deve eco-lo do valor de retorno e depois sair.

O meu problema é que eu não posso começar a method_exists() para encontrar o método! Eu sei que ela existe ... Eu codificado mesmo difícil (para fins de teste) métodos que eu sei com certeza existir.

Tem sido dirigindo-me um pouco louco, é alguém capaz de me dizer o que estou fazendo de errado?

Obrigado!

P.S. Eu estou usando o framework Kohana, mas eu não acho que isso deveria importar.

Atualizar

Você acha que expor meus nomes de métodos internos para o JavaScript (ou seja público) poderia ser motivo de preocupação de segurança?

Foi útil?

Solução

You're using the first argument to method_exists() as if it supports a callback argument, but it doesn't accept a callback. It accepts only an object instance or a class name (a string) for testing static methods.

Try this:

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

Re your second question, yes I think it's a security concern. You have done no validation that the request is well-formed. I would not use the "catch-all" solution you are designing.

Outras dicas

I think your code is supposed to say:

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

However, it is a bad idea to expose all the methods of your searchModel object to the world, so you should prefix the ajax methods with 'ajax_' or something similar so that it is only possible to call methods with that prefix:

// 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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top