CI 묻고 답하기

제목 코드를 짜긴짰는데 이해가 안됩니다ㅠ
글쓴이 수야디벨 작성시각 2012/10/26 10:30:35
댓글 : 5 추천 : 0 스크랩 : 0 조회수 : 19765   RSS


제가 java랑 c를 거쳐온 안드로이드/ios 개발자입니다.

그래서 약간 객체에 대한 개념이 잡혀있는 상태인데요~

코드이그나이터로 코드를 짰는데 이해가 잘 안되서 질문드립니다.


이해가 안되는 부분은 아래와 같은데요 ~

*member.php

function lists()//default 화면s
  {
   
   $this->load->model('member_model');
   $data['query'] = $this->member_model->getAll();
   $this->load->view('member_view',$data);

  } 

우선 기본적으로 db에 접근해 그 내용을 member_view에서 뿌려줍니다.


*member_view.php

<?php foreach($query as $row) : ?>
<h3><?="아이디: ".$row->id." 비밀번호:".$row->title." 이메일:".$row->author." 내용:".$row->contents ?>
<?=anchor('member/member_alert/'.$row->id,'수정')?></h3>
<hr/>
<?php endforeach;?>
<?=form_open('member/member_insert/');?>
<input type="submit" value="가입하기" />
</form>

그러면 위와 같은 폼에 db의 데이터들이 들어가서 보여지는데요.
이해가 안되는건 저 빨간 부분으 앵커입니다.

우선 저렇게 코딩을하면 member.php의 member_alert 함수를 호출하겠다 잖아요?
그런데, 바로 윗줄처럼 코딩을 하려고 하는게 맞다면 , 이렇게 해야 하는거 아닌가요?
<?=anchor('member/member_alert/','수정')?>  // ($row->id 를 빼버림)

물론 저렇게 $row->id를 하는 목적은 해당 자료의 링크를 구분하기 위함인건 알겠는데요.
이런식으로 링크가 붙잖아요?
member/member_alert/1  ...
member/member_alert/2 ...
member/member_alert/3...
(1,2,3인 이유는 id의 값이 1,2,3이기 때문에)

그래서 어느글을 수정하려고 눌렀는지 구분하기 위해서 인건 알겠는데,

문제는 ..

member.php의 내용은 이러한데

function member_alert()//수정폼으로 데이터를 넘기자.
  {
   $this->db->where('id',$this->uri->segment(3));
   $data['query'] = $this->db->get('data');
   $this->load->view('member_alert',$data);
  }


어떻게 member_alert/1 을해도 member_alert가 호출이 되는지 궁금합니다.
또한 어떻게 $this->uri->segment(3) 을(링크가 3번째에붙어서 세그먼트가 3인건 알아요)
을 하면 , 다른 php에서의 uri를 잘 집어낼수있는(뽑아낼수있는지)지가 이해가 안갑니다 ㅠ
(그 많고많은 링크중에서 어떻게 그 링크만 잡아낼수있는건지)
(즉,,member/member_alert/1 ...
member/member_alert/2 ...
member/member_alert/3...)중 어떤걸 눌렀는지 넘겨받은게 없는데 ..?


보다시피
function member_alert()//수정폼으로 데이터를 넘기자.
{
$this->db->where('id',$this->uri->segment(3));
$data['query'] = $this->db->get('data');
$this->load->view('member_alert',$data);
}

처럼 인자로 넘겨 받는게 없잖아요 ..??

그런데 어떻게 그렇게 콕 찝어서 내가 /1을 눌렀느지 /2를 눌렀는지를 잘 아는걸까요?
간단 명료하게 정리해주실분 안계시나요??

 다음글 트위터 연동할려면 ..[수정] (7)
 이전글 kohana와 ci간의 세션공유문제입니다. (12)

댓글

헛발이 / 2012/10/26 11:13:19 / 추천 0
아무것도 설정을 안하고 사용하게 되면 코드이그나이터 만의 기본적인 룰이 있습니다.

http://cikorea.net/user_guide_2.1.0/general/urls.html

즉 메뉴얼에 보시면 URL은 기본적으로

http://도메인/클레스명/함수명/기타등등.....

으로 인식하게 됩니다. 자신이 라우팅이나 다른 방식을 사용하게 되면
URL이 다른 방식으로 전달되겠지만 기본적인 URL방식은 http://도메인/클레스명/함수명/기타등등.....이 된답니다..

그 방법은 아마도 system에 있는 코어쪽을 보시면 알겠지만 코어는 대부분 건드리지도 않고 살펴 보지도 않쵸.. 저도 그렇구요 ㅋㅋ

하지만 아마도 이런 방식을 것입니다..

모든 URL은 index.php로만 하는것이죠.. 뒤에 무슨 문자가 붙거나 말거나... 무조건 index.php만 실행하는것이고..
그 index.php는 자신의 뒤에 붙은것들을 모두 스트링으로 가져와서 / 로 자른 후에 첫번째건 클래스명으로 두번째건 함수명으로 구분지어서 해당 콘트롤러를 자동으로 불러주는것이죠...

크레임위크의 기본동작이나 핵심구조등은 아마 직접 찾아 보셔야 할듯 싶습니다..

http://cikorea.net/user_guide_2.1.0/overview/appflow.html

그리고..


그리고 나중에 좀 하시면 알게 되시겠지만요..

segment로  몇번째 인자가 id값이다 라고 하는건 조금 위험? 한 일이 된답니다.
왜냐 하면 URL이 바뀐다거나.. 즉

http://도메인/클레스/함수/...

이렇게 되었던 사이트가 정책이 바뀌

http://도메인/모듈/클레스/함수/...

로 변경이 되거나..

http://도메인/클레스/함수/카테고리/...
http://도메인/국가/클레스/함수/...

로 변경된다면 이미 3번째라고 정해진 아이디값을 가져오기가 불편해 지거든요..

그래서 포럼소스에도 있듯이 URL를 모두 가져와 자신만의 아이디값찾는 함수를 만들어
사용한답니다..

즉 전체 URL을 가져와서 /로 분리 하고 그중에서 함수명다음의 인자가 아이디값이다
라는 특정한 함수를 만드는거죠...

아마 포럼 소스를 보시면 금방 아실듯 싶어요...


그리고 자신의 소스중에...

system/core/URI.php

를 한번 보시기 바랍니다..

pithecus / 2012/10/26 13:29:31 / 추천 0
 위의 헛발이님이 잘 설명해주신것 처럼
CI 에서 모든 http request 는 index.php 를 통해서 처리가 됩니다.
(그래서 rewrite 를 설정할 때 RewriteRule ^(.*)$ /index.php/$1 를 설정하는거죠)

그리고 index.php 에서는 routing 과정을 거치는 데 
이때 php 의 $_SERVER['REQUEST_URI'] 를 파싱해서 함수를 호출하는거죠.

http://xxx.com/member/member_alert/2 페이지를 호출할 경우
$_SERVER['REQUEST_URI'] = "http://xxx.com/member/member_alert/2"
이런 string 이 들어있을거고
php 의 parse_url() 내장 함수를 이용해서 "member/member_alert/2"를 분리할 수 있는거죠.
이제 "/" 로 explode 하면 ["member","member_alert","2"] 배열이 만들어질거고
call_user_func()
 로 member 컨트롤러의 member_alert 를 실행합니다. (2는 인자로 전달)

그래서 처음으로 돌아가면
마지막 URL
 에 1,2,3 뭘 입력하든 member_alert 가 호출되는 겁니다.

여담이지만 php 의 놀라우면서도 무식한 특징중의 하나가 
parse_url() 이란 함수를 내장함수로 지원한다는 거 같네요.
처음엔 CI helper 에서 왜 parse_url 함수가 없나 하고 찾고있었습니다. 
-_-;;
변종원(웅파) / 2012/10/26 13:52:28 / 추천 0
매뉴얼도 중요하지만. 어느 정도 경력이 되시니 해당 core함수를 직접 보시는 것이 상당한 도움이 됩니다. 매뉴얼에는 segment함수는 주소를 배열화한 것의 순서에 해당하는 값을 반환하는 것이라고 되어있는데 실제 어떻게 동작하는지는 안나오죠. ci를 제대로 쓰시려먄 core도 얄어보시기 바랍니다. ^^
한대승(불의회상) / 2012/10/26 14:11:53 / 추천 0
웅파님 조언에 한 표!!!

system/core/URI.php 소스를 분석해 보세요. ^^
수야디벨 / 2012/10/27 00:06:10 / 추천 0

와 , 정말 ~ ^^
여기 게시판 분들은 전부다 설명이 친절한거 같아요.

정말 이해가 쏙쏙 되고 얻어가는게 많습니다^^

감사합니다 ㅎ