PHP method_exists ile Yardım ()

2 Cevap php

Ajax için benim denetleyicisi için bir "catch all" yöntemini yazıyorum. Bu 'ajax' denir: P

Bu şu anda böyle görünüyor

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;



}

Belirgin olmaması halinde, ben ajax bunun bir Ajax isteği değil düşünürse ilk kurtarmak, ve o zaman, olarak kabul edildi yöntem olup olmadığını görmek benim $this->searchModel denetlemek istiyor ajax yöntemin argüman.

Bu yöntem bulursa, o dönüş değeri ve daha sonra çıkış bulunuyor yankı gerekir.

Benim sorunum yöntemi bulmak için method_exists() elde edemez! Ben bile zor (deneme amaçlı) belirli varoldukları için bildiğim yöntemler kodlu ettik ... o var, biliyorum.

O beni biraz deli oldu, ben yanlış yapıyorum bana ne söyleyebilir kimse var mı?

Teşekkürler!

P.S. Ben Kohana framework kullanıyorum, ama önemli gerektiğini sanmıyorum.

UPDATE

Güvenlik endişe olabilir JavaScript (yani halk) benim iç yöntemi isimlerini teşhir düşünüyor musunuz?

2 Cevap

Bu bir geri arama argüman destekler, ancak bir geri arama kabul etmezse gibi method_exists() için ilk argüman kullanıyoruz. Statik test yöntemleri için sadece bir nesne örneği veya bir sınıf adını (bir dize) kabul eder.

Bu deneyin:

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


İkinci soruya Re, evet ben bir güvenlik sorunu olduğunu düşünüyorum. Sen isteği iyi biçimlendirilmiş olduğuna dair doğrulama yaptım. Ben tasarlarken "catch-all" çözüm kullanmak olmaz.

Senin kod söylemek gerekiyordu düşünüyorum:

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

Ancak, dünya için searchModel nesnesinin tüm yöntemleri göstermek için, öyledir böylece 'ajax_' veya benzer bir şey ile ajax yöntemlerini önek gerekir is kötü bir fikir bu önek ile yöntemlerini çağırmak mümkündür:

// 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();