Domanda

Sto scrivendo un messaggio " catch all " metodo per il mio controller per Ajax. Si chiama 'ajax': P

Ecco come appare attualmente

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;



}

Nel caso in cui ciò non sia ovvio, voglio che l'ajax salvi prima il salvataggio se pensa che non sia una richiesta Ajax, quindi controlla il mio $ this- > searchModel per vedere se ha il metodo che è stato passato come argomento del metodo ajax.

Se trova il metodo, dovrebbe fare eco al suo valore di ritorno e quindi uscire.

Il mio problema è che non riesco a trovare il method_exists () per trovare il metodo! So che esiste ... Ho anche dei metodi codificati (a scopo di test) che conosco per certo esistono.

Mi sta facendo impazzire, qualcuno è in grado di dirmi cosa sto facendo di sbagliato?

Grazie!

P.S. Sto usando il framework Kohana, ma non credo che dovrebbe importare.

Aggiorna

Ritieni che esporre i miei nomi di metodi interni a JavaScript (ovvero pubblico) potrebbe essere un problema di sicurezza?

È stato utile?

Soluzione

Stai usando il primo argomento per method_exists () come se supporti un argomento di callback, ma non accetta un callback. Accetta solo un'istanza di oggetto o un nome di classe (una stringa) per testare metodi statici.

Prova questo:

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

Per la tua seconda domanda, sì, penso che sia un problema di sicurezza. Non hai verificato che la richiesta sia ben formata. Non userei il "tutto sommato" soluzione che stai progettando.

Altri suggerimenti

Penso che il tuo codice dovrebbe dire:

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

Tuttavia, è una cattiva idea esporre tutti i metodi del tuo oggetto searchModel al mondo, quindi dovresti aggiungere il prefisso dei metodi ajax con ' ajax_ ' o qualcosa del genere simile in modo che sia possibile chiamare metodi con quel prefisso:

// 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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top