سؤال

أنا أكتب طريقة "التقاط الكل" لوحدة التحكم الخاصة بي لأياكس.يطلق عليه "أجاكس" :P

وهذا هو ما يبدو عليه حاليا

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;



}

في حالة عدم وضوح ذلك، أريد من ajax أن ينقذ أولاً إذا كان يعتقد أنه ليس طلب Ajax، ثم تحقق من $this->searchModel لمعرفة ما إذا كانت تحتوي على الطريقة التي تم تمريرها كحجة لطريقة ajax.

إذا عثر على الطريقة، فيجب أن يردد قيمة الإرجاع الخاصة به ثم يخرج.

مشكلتي هي أنني لا أستطيع الحصول على method_exists() للعثور على الطريقة!أعرف أنها موجودة..لقد قمت أيضًا بتشفير الأساليب (لأغراض الاختبار) التي أعرف وجودها على وجه اليقين.

لقد كان الأمر يقودني إلى الجنون قليلاً، هل يستطيع أحد أن يخبرني بالخطأ الذي أفعله؟

شكرًا!

ملاحظة.أنا أستخدم إطار عمل كوهانا، لكن لا أعتقد أنه مهم.

تحديث

هل تعتقد أن تعريض أسماء الطرق الداخلية الخاصة بي إلى JavaScript (أي؟العامة) يمكن أن يكون مصدر قلق أمني؟

هل كانت مفيدة؟

المحلول

أنت تستخدم الوسيطة الأولى ل method_exists() كما لو كان يدعم وسيطة رد الاتصال، لكنه لا يقبل رد الاتصال.يقبل فقط مثيل كائن أو اسم فئة (سلسلة) لاختبار الأساليب الثابتة.

جرب هذا:

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

فيما يتعلق بسؤالك الثاني، نعم أعتقد أنه مصدر قلق أمني.لم تقم بالتحقق من صحة صياغة الطلب.لن أستخدم الحل "الشامل" الذي تصممه.

نصائح أخرى

أعتقد أن الكود الخاص بك من المفترض أن يقول:

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

ومع ذلك، فإنه يكون إن كشف جميع أساليب كائن searchModel الخاص بك للعالم فكرة سيئة، لذا يجب عليك بادئة أساليب ajax بـ "ajax_" أو شيء مشابه بحيث يكون من الممكن فقط استدعاء الأساليب التي تحتوي على تلك البادئة:

// 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();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top