Question

Je vous écris un "attrape tout" méthode pour mon contrôleur pour ajax. Il s’appelle 'ajax': P

Voici à quoi il ressemble actuellement

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;



}

Au cas où cela ne serait pas évident, je souhaite que ajax s’appuie d’abord sur le désarmement s’il estime qu’il ne s’agit pas d’une requête Ajax, puis vérifiez votre $ this- > searchModel pour voir si elle le permet. a la méthode qui a été transmise comme argument de la méthode ajax.

Si la méthode est trouvée, elle doit renvoyer la valeur renvoyée, puis quitter.

Mon problème est que je ne peux pas obtenir le method_exists () pour trouver la méthode! Je sais que ça existe ... J'ai même des méthodes codées (à des fins de test) que je sais avec certitude qui existent.

Cela me rend un peu fou, est-ce que quelqu'un est capable de me dire ce que je fais mal?

Merci!

P.S. J'utilise le framework Kohana, mais je ne pense pas que cela devrait avoir de l'importance.

MISE À JOUR

Pensez-vous que l’exposition de mes noms de méthodes internes à JavaScript (c’est-à-dire public) pourrait poser un problème de sécurité?

Était-ce utile?

La solution

Vous utilisez le premier argument de method_exists () comme s'il prenait en charge un argument de rappel, mais n'accepte pas de rappel. Il accepte uniquement une instance d'objet ou un nom de classe (une chaîne) pour tester les méthodes statiques.

Essayez ceci:

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

En ce qui concerne votre deuxième question, oui, je pense que c’est un problème de sécurité. Vous n'avez pas validé le fait que la demande est bien formée. Je ne voudrais pas utiliser le "fourre-tout" solution que vous concevez.

Autres conseils

Je pense que votre code est censé dire:

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

Cependant, c'est une mauvaise idée d'exposer toutes les méthodes de votre objet searchModel au monde. Vous devez donc préfixer les méthodes ajax avec ' ajax _ ' ou quelque chose d'autre. similaire de sorte qu'il est uniquement possible d'appeler des méthodes avec ce préfixe:

// 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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top