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?

¿Fue útil?

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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top