Frage

Ich schreibe eine „catch all“ Methode für meinen Controller für Ajax. Es heißt 'Ajax': P

Dies ist, was es sieht derzeit wie

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;



}

Falls die nicht offensichtlich ist, mag ich die Ajax zuerst aus der Patsche helfen, wenn sie es nicht ein Ajax-Request denken, und dann, mein $this->searchModel überprüfen, um zu sehen, ob es die Methode, die in als die Ajax-Methode des arguement geben wurde .

Wenn es die Methode nicht findet, sollte es echo es ist Rückgabewert und dann beenden.

Mein Problem ist, ich kann nicht die method_exists() erhalten, die Methode zu finden! Ich weiß es nicht gibt ... Ich habe auch hart codiert (für Testzwecke) Methoden, die ich für bestimmte exist kennen.

Es ist mir ein wenig verrückt gefahren, ist jemand in der Lage, mir zu sagen, was ich falsch mache?

Danke!

P. S. Ich bin mit dem Kohana Rahmen, aber ich glaube nicht, dass es eine Rolle.

UPDATE

Glauben Sie, meine internen Methodennamen Aussetzen an der JavaScript (das heißt public) von Sicherheitsbedenken sein könnte?

War es hilfreich?

Lösung

Sie verwenden das erste Argument als method_exists() wenn es einen Rückruf Argument unterstützt, aber nicht einen Rückruf an. Es nimmt nur eine Objektinstanz oder einen Klassennamen (String) für statische Methoden zu testen.

Versuchen Sie folgendes:

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

Ihre zweite Frage Re, ja, ich denke, es ist ein Sicherheitsproblem. Sie haben keine Validierung durchgeführt, dass der Antrag wohlgeformt ist. Ich würde die „catch-all“ -Lösung nicht verwenden Sie entwerfen.

Andere Tipps

Ich denke, Ihr Code soll sagen:

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

Es ist jedoch ist eine schlechte Idee, alle Methoden Ihres searchModel Objekt in der Welt zu belichten, so dass Sie ähnlich die Ajax-Methoden mit ‚ajax_‘ oder etwas Präfix sollte, so dass es nur möglich ist, rufen Methoden mit diesem Präfix:

// 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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top