Ayuda con PHP method_exists ()
Pregunta
Estoy escribiendo un " atrapar todo " Método para mi controlador para ajax. Se llama 'ajax': P
Así es como se ve actualmente
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;
}
En caso de que no sea obvio, quiero que el ajax salga primero si cree que no es una solicitud de Ajax, y luego, verifique mi $ this- > searchModel
para ver si tiene el método que se aprobó como argumento del método ajax.
Si encuentra el método, debería hacer eco de su valor de retorno y luego salir.
¡Mi problema es que no puedo obtener el method_exists ()
para encontrar el método! Sé que existe ... Incluso he codificado (con fines de prueba) métodos que conozco existen.
Me ha estado volviendo un poco loco, ¿alguien puede decirme qué estoy haciendo mal?
¡Gracias!
P.S. Estoy usando el marco Kohana, pero no creo que deba importar.
UPDATE
¿Cree que exponer los nombres de mis métodos internos al JavaScript (es decir, público) podría ser un problema de seguridad?
Solución
Está utilizando el primer argumento para method_exists ()
como si admitiera un argumento de devolución de llamada, pero no acepta una devolución de llamada. Solo acepta una instancia de objeto o un nombre de clase (una cadena) para probar métodos estáticos.
Prueba esto:
if (method_exists($this->searchModel, $method)) {
echo $this->searchModel->$method();
}
Re su segunda pregunta, sí, creo que es un problema de seguridad. No ha validado que la solicitud esté bien formada. No usaría el "todo-atrapar" solución que está diseñando.
Otros consejos
Creo que se supone que su código diga:
if(method_exists($this->searchModel, $method))
echo $this->searchModel->$method();
Sin embargo, es una mala idea exponer todos los métodos de su objeto searchModel al mundo, por lo que debe anteponer los métodos ajax con ' ajax_
' o algo así similar para que solo sea posible llamar a métodos con ese prefijo:
// 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();