CI 묻고 답하기

제목 index 메쏘드에 변수 전달하기..
글쓴이 Die.t 작성시각 2009/05/04 16:50:00
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 37807   RSS
class Test extends Controller {

function Test() {
parent::Controller();
}

function index($var) {
echo $var
}
}
와 같이 컨트롤러의 기본 메쏘드인 index()에 get 방식으로 변수를 전달하려면..

system/codeigniter/CodeIgniter.php에서

// is_callable() returns TRUE on some versions of PHP 5 for private and protected
// methods, so we'll use this workaround for consistent behavior
if ( ! in_array(strtolower($method), array_map('strtolower', get_class_methods($CI))))
{
//show_404("{$class}/{$method}");

show_404를 주석 처리한 후

$method = 'index';
array_splice($URI->rsegments, 0, 1, array($class, $method));
$RTR->set_method($method);

를 삽입하면 됩니다..


더 좋은 방법이 없을까 고민했는데 딱히 떠오르질 않네요..
아시는 분 있으시면 코멘트 부탁드립니다.
 다음글 codeigniter 요청 처리절차 (1)
 이전글 개발 참고용 CodeIgniter 라이브러리 모음(계속... (2)

댓글

kirrie / 2009/05/04 17:39:57 / 추천 0
(일단 fancy url을 사용하도록 config.php파일과 .htaccess를 설정했다는 가정 하에서) 음.. 예를 들어

http://www.foo.com/board

와 같은 url을 입력했다고 했을때 라우팅을 커스터마이징 하지 않았다면 내부적으로는
board 클래스의 index 메소드를 실행합니다. 즉, 위의 url은

http://www.foo.com/board/index

와 같은 효과를 가집니다.

제가 이해한 바로는 http://www.foo.com/board/vars 와 같이 파라미터를 주시겠다는 말씀 같은데,
사실 이건 올바른 사용 같지가 않네요. 왜냐하면 board/vars라고 하면 이건 board 클래스의 vars라는 메소드를
실행하겠다는 의미하고 같으니까 말이죠. 라우팅 설정을 수정해서 사용한다고 하면 board 클래스의 다른 메소드는 또 사용할 수가 없게 됩니다.

$route['board/(:any)'] = 'board/index/$1';

와 같이 한다면 겉으로는

http://www.foo.com/board/vars

와 같이 입력한다고 해도 내부적으로는

http://www.foo.com/board/index/vars

라고 처리되므로 파라미터를 전달 할 수 있게 되지만, 이렇게 하면 board 클래스의 index 메소드 밖에는 사용할 수 없게 됩니다.
그러므로 굳이 그렇게 사용하셔야 한다면 index 메소드는 그대로 놔두시고, index 메소드에 해당하는 다른 메소드 (예를 들어 list 메소드)
와 같은 것을 만들어서 그쪽으로 리디렉션 하도록 하시는게 좋을 것 같습니다.

혹은, 제가 Iruka님의 글을 잘못 이해했다면 지적해주세요. ^^
Die.t / 2009/05/04 19:05:35 / 추천 0
답글 감사드립니다.

말씀하신대로 사실 올바른 사용법은 당연히 - 레퍼런스에 있는 사용법이 아니니까 - 아닙니다만..몇 차례 컨트롤러 기본 메쏘드에 변수 전달이 안되는 점 때문에 불편했던 적이 있었습니다.
물론 url 계획이나 구조화 관련 잘 설계된 계획서가 있다면 필요없는 꼼수겠지만요..^^

위에 CodeIgniter.php에서 수정한 부분은 특별히 uri routing 관련 config 설정 때 조금 주의하신다면 특별히 문제는 없을 것 같습니다.
컨트롤러 내의 다른 메쏘드 실행도 문제되지 않는 부분에서 수정했구요.

board 컨트롤러의 list 메쏘드가 vars라는 하나의 변수만 필요해도 http://www.foo.com/board/list/vars/vars/vars/vars라고 입력해도 실행이 되길래 비슷한 방식으로 수정해 본 겁니다.
http://www.foo.com/board/vars 와 같은 uri_string이 입력될 경우 수정을 안한 상태에서는 404 에러 페이지가 표시되구 $RTR->fetch_method() 하면 vars 가 출력됩니다..
위의 소스는 그냥 이 부분에 에러 표시대신 index 메쏘드를 할당한 거 밖에 없거든요..