php method_exists ()에 대한 도움말
문제
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();