CI 묻고 답하기

제목 XML-RPC 다른 컨트롤러 메서드 실행이 안되는거 같아요.
글쓴이 coens 작성시각 2010/12/27 10:54:16
댓글 : 1 추천 : 0 스크랩 : 0 조회수 : 20647   RSS

제목처럼 XML-RPC쓸때 실행할 메서드가 다른 컨트롤러에 있으면 실행이 안되는거 같은데욥...
코드이그나이트 공식포럼에 가서 사람들 얘기들도 좀 찾아봤는데..
그냥,  CI 버그다. 그냥 안되는거다. 머 이런 얘기들만 줄줄해서 좌절이. ㅠ

그냥 간단하게.... 유저 가이드에 있는 다음부분인데요....
-------------------------------------------------------------------------------
 

XML-RPC 서버 생성 Creating an XML-RPC Server

XML-RPC 서버는 교통경찰같이 동작합니다. 요청을 기다리고 들어온 요청에 대해서는 적합한 함수로 연결(redirect) 해 줍니다.

XML-RPC 서버를 생성하려면,요청을 받을 컨트롤러에서 XML-RPC 서버 클래스를 초기화하고 들어온 요청을 적절한 클래스/함수로 연결하는 규칙을 배열로 설정해야 합니다.

아래 예제를 보세요:

$this->load->library('xmlrpc');
$this->load->library('xmlrpcs');

$config['functions']['new_post'] = array('function' => 'My_blog.new_entry'),
$config['functions']['update_post'] = array('function' => 'My_blog.update_entry');
$config['object'] = $this;

$this->xmlrpcs->initialize($config);
$this->xmlrpcs->serve();

위예제는 서버가 받아들일 두가지 요청처리 메소드를 정의하고 있습니다. 요청을 받는 메소드는 배열의 왼쪽에 있습니다. 둘중 하나의 요청이 들어오면, 오른쪽에 있는 클래스/함수로 매핑됩니다.

'object'키는 실재객체(instantiated class object)를 전달하는 특별한 키입니다. 매핑하고자하는 메소드가 CodeIgniter 부모객체(super object)의 일부가 아닐때 필요합니다.

다시말해, XML-RPC 클라이언트가 new_post 메소드에 대한 요청을 전송하면, 여러분의 서버는 My_blog 클래스를 로드한후 new_entry 함수를 호출합니다.update_post 메소드에 대한 요청이 들어오면 , 서버는 My_blog 클래스를 로드한 후 update_entry 함수를 호출 합니다.

위 예제의 함수이름은 임의로 지은것입니다.

서버 요청 처리 Processing Server Requests

XML-RPC 서버가 요청을 받고 클래스/메소드 를 로드하면, 클라이언트로 부터 받은 데이터를 그 메소드로 넘겨주게 됩니다.

위의 예제에서 new_post 메소드가 요청되면, 서버는 아래와 같은 형태의 클래스가 있을것이라고 기대합니다:

class My_blog extends Controller {

    function new_post($request)
    {

    }
}

$request 변수는 서버에서 구성(compile)된 객체이며,클라이언트로부터 전달된 데이터를 포함하고 있습니다.요청을 처리하기위해 요청파라미터(request parameters)에 접근하려면 이 객체를 사용합니다. 처리가 끝나면 여러분은 응답(Response)을 클라인트에게 되돌려줄것입니다.

------------------------------------------------------------------------------------------------


위에 붉게 해놓은 곳이 실재 실행해보면 잘 안되는거 같아서요......
라이브러리를 로드한 컨트롤러 내의 메서드들은 잘 되는데, 다른 컨트롤러에 있는 메서드를 실행하려 하면
없는 메서드라고 에러가 나더라구요..

그래서 코어 라이브러리를 열어봤는데요.. -_-;

system/libraries/Xmlrpcs.php 파일의 275번줄쯤에...

   if ($objectCall && ! is_callable(array($method_parts['0'],$method_parts['1'])))
   {
    return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);
   }


이 부분에서 그냥 에러로 처리되는거 같아요... 저기.. is_callable(array($method_parts['0'],$method_parts['1'])
이곳 말이죠...

그래서 임시로 이곳 IF를 일단 그냥 넘어가게 해 놓고 돌려보니까.

결국 호출되는 메서드가 지정된 컨트롤러가 아닌, XML-RPC 서버 컨트롤러 내부의 동일 이름의 메서드를 호출하더라고요

그러니까. 없는 메서드 에러나는건 당연.... -_-;


----------------

질문이 많이 길어버렸는데요 ㅠㅠ

간단하게 말해서... 위에 저 예제를 제대로 실행하려면 어떻게 해야할까요.. ㅠㅠ

 

 다음글 ci로 모바일 페이지 구축하기 (2)
 이전글 CI 이용시 실행시간이 어떻게 되나요..? (2)

댓글

변종원(웅파) / 2010/12/27 13:26:36 / 추천 0
library를 expand하셔서 사용하시면 됩니다. (방법은 매뉴얼 참고)

matchbox 라이브러리(포럼에서 검색)를 보시면 참고하실 만한 소스가 있습니다.
(기존 라이브러리를 어떻게 확장하고 application 이외의 디렉토리에서 controller를 찾는지)