문제

Ajax 용 컨트롤러를위한 "All All"메소드를 작성하고 있습니다. 'ajax'라고합니다 : 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() 방법을 찾으려면! 나는 그것이 존재한다는 것을 알고 있습니다 ... 나는 심지어 (테스트 목적을 위해) 하드 코딩했습니다.

그것은 나를 조금 미쳤다. 내가 뭘 잘못하고 있는지 말해 줄 수있는 사람이 있습니까?

감사!

추신 : 나는 Kohana 프레임 워크를 사용하고 있지만 그것이 중요하지 않다고 생각합니다.

업데이트

내 내부 방법 이름을 JavaScript (IE Public)에 노출시키는 것이 보안 문제 일 수 있다고 생각하십니까?

도움이 되었습니까?

해결책

당신은 첫 번째 논쟁을 사용하고 있습니다 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