Ajuda com method_exists PHP ()
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?
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();