CI 묻고 답하기

제목 모델 $this->db 처리 인식문제.
글쓴이 아싸리비아 작성시각 2014/10/20 10:30:17
댓글 : 7 추천 : 0 스크랩 : 0 조회수 : 14183   RSS
코드이그나이터를 접하고 이것저것 테스트 진행하면서.
기초를 다듬고 있는데 막히는데가 발생하네요 ;;

일단 컨트롤러 에서 모델을 불러왔습니다.
모델 메소드상에서 $this->db 없다고 나오네요.

그래서 혹시 커넥트 문제가 있나 해서 
$CI =& get_instance();
print_r($CI->db)를 해보았지만 정상적으로 정보가 있어 당황스럽습니다.

그렇다고 $this->db를 선언해서 처리할수도 있겠지만, 
참고 소스를 아무리 봐도 그렇게 처리된 사례를 볼수가 없어서 당황스럽네요.

우선 환경은 아래와 같습니다.
Codeigniter 2.2.0 + HMVC 5.4 

소스는 간단하게 이렇게 처리하였습니다.
(DB는 현재 자동 커넥트는 배제 하고 수동 처리를 하도록 하였습니다.)

class Testc extends CI_Controller {
      public function history() {    
        $this->load->model('Bizhistory_model', '', true);
         $this->Bizhistory_model->historyList();
      }
}

class Bizhistory_model extends CI_Model {
    function __construct() {
        parent::__construct();
    }
    public function historyList() {
        print_r($this->db);
    }
}



흠 HMVC 의 버그인지 참 당황스럽네요.
Header, Footer 를 분리하기위한목적으로 HMVC를 사용하고 있는데 
순수하게 코드이그나이터만 사용해야할지 고민되네요.

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

추가적으로..

혹.. 아무리 예제를 찾아봐도 Controller 에서 Controll를 호출하는 방법은
HMVC 5.4 버전이나, 위젯을 이용해야 하는걸로 알고 있는데.
혹 기본 기능중에 제공되는게 있나요?

 
 다음글 코드이그나이터 괄호 설정 (2)
 이전글 쇼핑몰에서 파일 업로드 할떄... (5)

댓글

들국화 / 2014/10/20 10:45:33 / 추천 0
application/config/autoload.php에 자동로그인을 등록해 주거나.
필요한 곳에서 명시적으로 로딩해 줘야 합니다.
 

$autoload['libraries'] = array('database')

변종원(웅파) / 2014/10/20 11:55:54 / 추천 0
컨트롤러에서 로딩을 했다고 하시는데 올려주신 소스에선 데이터베이스 로딩하는 부분이 없습니다.
수동로딩한다고 하셨으니 컨트롤러에 아래 구문을 넣어줘야 데이터베이스 로딩이 됩니다.
$this->load->database();
아싸리비아 / 2014/10/20 13:03:22 / 추천 0
들국화님, 웅파님 답변 갑사합니다.


들국화님 // autoload 를 해야만 $this->db 를 사용가능한건가요 ; 흠.. 
DB 커넥트부분과 분리를 하려고 하는 의도라. autoload로 database는 배제했던부분인데.
다른 방법을 좀 찾아봐야겠네요 흠..

/------------------------------------------

웅파님 // 메뉴얼 보고 테스트 진행중인데..
모델 불러올때 아래처럼 불러올경우 3번째 인자값이 default에 해당되는 db를 자동 로드 하는걸로 알고 있는데.
아닌가요?
<span neue,helvetica,arial,sans-serif"="">$this->load->model('Bizhistory_model', '', true);

controller에서 $this->load->database(); 후에 해도 처리가 model 에서 $this->db가 않되는거 봐선.. 다른 문제로 보이는데..
원인을 찾기 어렵네요. 코어부분을 분석해야하는건지..

 
kaido / 2014/10/20 13:27:05 / 추천 0

얼마전 저도  $this->db 이게 안먹어서 한참 고민 했었는데

전 단순히 인코딩이 UTF8 BOOM+ 여서 나왔던 문제였네요  ( ..)

아싸리비아 / 2014/10/20 14:26:56 / 추천 0
kaido님 답변감사합니다.
혹 저도 그런가 싶어서 파일 모두 열어서 인코딩 체크 확인해보았으나 다 UTF-8으로 정상적이네요..
흠.. kaido 님 말대로라면 다른 문제로 인해서 발생될수 있는 문제로 생각되어 좀더 꼼꼼하게 체크해봐야할거 같습니다.
한대승(불의회상) / 2014/10/20 14:50:46 / 추천 0
autoload에 설정 했을때는 문제가 없나요?

model __construct() 쪽에 $this->load->database() 하셔도 됩니다.
 
class Bizhistory_model extends CI_Model {
    function __construct() {
        parent::__construct();
        $this->load->database();
    }
    public function historyList() {
        print_r($this->db);
    }
}
아싸리비아 / 2014/10/20 15:01:24 / 추천 0
불의화상님 답변감사합니다. 
해당 부분도 확인하였으나 해결되지 않았습니다 ㅠㅠ

//------------------------------------------------

전반적으로 소스 뜯어보고 삭제하면서 문제 발생부분을 확인하였습니다.
HMVC 새로운 기능으로 인한 버그로 보여지네요 ㅠㅠ;

Controller 에서 _remap() 을 이용하여 header, footer를 붙이는 로직이 추가하여 작업하였습니다.
 
public function _remap($method, $params = array()) {
        
        if (method_exists($this, $method)) {
            $commonData = array(
                'title'            => TITLE,
                'isMainPage'    => false,
                'isSubPage'        => true,
                'subPage'        => $method
            );
            
            // 벤치마크 자료 하단 표출
            $this->output->enable_profiler(TRUE);
            
            $this->setHeader();
            $this->output->append_output( modules::run('common/header', $commonData) );
            call_user_func_array(array($this, $method), $params);
            $this->output->append_output( modules::run('common/footer', $commonData) );
            
        } else {
            show_404();
        }
    }


이중에....
modules::run을 하는 순간 $this->db가 인식불가가 되버리네요.. 에구....
위젯을 사용해야할지 고민이네요... hmvc 5.4 에서 위젯같은 기능이 있다고 해서 
위젯을 사용안하고 위방법처럼 했던건데.

흠.. header, footer controller를 호출할수 있는 방법을 좀 찾아봐야될꺼 같네요.
아니면 상속을 이용해서 가공해야 할거 같네요.


들국화님, 웅파님, kaido님, 불의회상님 답변 감사드립니다.