개발 Q&A

제목 Controller에서 Controller 연결시 Session 클래스를 찾을 수 없다는 오류가 발생합니다.
카테고리 PHP
글쓴이 혜화꽃미미 작성시각 2017/01/12 16:58:44
댓글 : 8 추천 : 0 스크랩 : 0 조회수 : 400   RSS

안녕하세요.

Codeigniter Controller에서 Controller를 호출하려고 하는데 Session 클래스를 찾을 수 없다는 오류가 발생합니다.

현재 Codeigniter 버전은 3.1.0 사용하고 있고 호출하는 Controller의 부모 Controller에서 session을 로드하고 있고, 호출되는 Controller에서는 session을 로드하지 않고 있습니다.

 

호출하는 Controller

defined('BASEPATH') OR exit('No direct script access allowed');

require_once("application/controllers/inc/Cmci_controller.php"); // 상위 클래스
require_once("application/controllers/Welcome.php"); // contents

class Welcome2 extends Cmci_controller {

	public function index()
	{
		$this->load->view('welcome_message');
	}

	public function hi()
	{
		$Welcome = new Welcome();
		$Welcome->hello();

		echo '1';
	}

}

호출되는 Controller

defined('BASEPATH') OR exit('No direct script access allowed');

require_once("application/controllers/inc/Eventci_Controller.php"); // 상위 클래스

class Welcome extends Eventci_Controller {

	public function index()
	{
		$this->load->view('welcome_message');
	}

	public function hello()
	{
		echo 'hello';
	}
}

이 소스를 실행해보면 Unable to locate the specified class: Session.php 라고 나옵니다.

사이트에 올라와 있는 다른 분들이 올려주신 레퍼런스 확인해 보고 코드 작성해 보았는데, 그 분들은 잘 된다고 하시는데 저는 왜 이런 오류가 나는지 모르겠네요..

혹시나 해서 로그파일을 확인해 보았습니다.

INFO - 2017-01-12 16:32:36 --> Config Class Initialized
INFO - 2017-01-12 16:32:36 --> Hooks Class Initialized
DEBUG - 2017-01-12 16:32:36 --> UTF-8 Support Enabled
INFO - 2017-01-12 16:32:36 --> Utf8 Class Initialized
INFO - 2017-01-12 16:32:36 --> URI Class Initialized
INFO - 2017-01-12 16:32:36 --> Router Class Initialized
INFO - 2017-01-12 16:32:36 --> Output Class Initialized
INFO - 2017-01-12 16:32:36 --> Security Class Initialized
DEBUG - 2017-01-12 16:32:36 --> Global POST, GET and COOKIE data sanitized
INFO - 2017-01-12 16:32:36 --> Input Class Initialized
INFO - 2017-01-12 16:32:36 --> Language Class Initialized
INFO - 2017-01-12 16:32:36 --> Loader Class Initialized
INFO - 2017-01-12 16:32:36 --> Controller Class Initialized
INFO - 2017-01-12 16:32:36 --> Database Driver Class Initialized
INFO - 2017-01-12 16:32:36 --> Session: Class initialized using 'files' driver.
INFO - 2017-01-12 16:32:36 --> User Agent Class Initialized
INFO - 2017-01-12 16:32:36 --> Helper loaded: html_helper
INFO - 2017-01-12 16:32:36 --> Helper loaded: url_helper
INFO - 2017-01-12 16:32:36 --> Helper loaded: alert_helper
INFO - 2017-01-12 16:32:36 --> Model Class Initialized

Error라고 나오는 부분은 없었고 중간에 Session Class에 대한 메시지도 있습니다.

Controller도 단지 Class일 뿐인데 왜 연결이 안 되는지 몇일째 구글링 중입니다ㅠ

혹시라도 저와 같은 메시지 경험하셨다면 도움 부탁드립니다ㅠ

 다음글 기초서 추천부탁드려요 (1)
 이전글 PHP 세션 파일 수

댓글

한대승(불의회상) / 2017/01/12 18:07:43 / 추천 0

CI는 컨트롤러를 로드 하면 컨트롤러 객체 안에 변수를 생성하여 라이브러리를 로드 합니다.

컨트롤러를 include한 후 생성된 객체는 현재 컨트롤러와 다른 객체이기 때문에 현재 컨트롤러에 로드된 라이브러리가 매핑 되지 않아 에러가 발생 합니다.

이를 해결하기 위해선 현재 컨트롤러에 로드된 라이브러리를 새로 생성된 객체에 매핑 시켜 주어야 합니다.

아래 처럼 코드를 수정해 보세요.

    public function hi()
    {
        $Welcome = new Welcome();
		
		foreach (get_object_vars($this) as $key => $object) {
			$Welcome->$key =& $this->$key;
		}
		
        $Welcome->hello();
 
        echo '1';
    }

 

혜화꽃미미 / 2017/01/12 20:48:38 / 추천 0

답변주셔서 정말 감사합니다^^

설명주신 내용 기반으로 위 코드상에 있는 $this 값을 찍어보니 array안에 object형식으로 코드이그나이터 라이브러리 값들이 들어가더라구요.. 이 안에 Session도 들어가 있던데 이 부분을 새로 생성된 객체에 매핑 시켜주어야 한다고 하시는 거지요?

그런데 제가 저 소스처럼 수정을 해보았는데 3번 라인에 객체를 생성하자마자 같은 메세지가 출력이 됩니다.

그리고 아래를 타지 않네요.. /system/core/Common.php 에서 메세지 출력 후 exit로 끊어 버리고 있어요.

		// Did we find the class?
		if ($name === FALSE)
		{
			// Note: We use exit() rather than show_error() in order to avoid a
			// self-referencing loop with the Exceptions class
			set_status_header(503);
			echo 'Unable to locate the specified class: '.$class.'.php';
			exit(5); // EXIT_UNK_CLASS
		}

이런 경우 코어를 변경하시나요? 저는 아직까지 코어를 수정해 본적은 없어서 다른 분들은 어떻게 해결하시는지 궁금하네요..

한대승(불의회상) / 2017/01/13 10:53:50 / 추천 0
세션 클래스는 어느 시점에 로드 되나요?
혜화꽃미미 / 2017/01/13 11:06:58 / 추천 0

세션클래스는 원문에 첨부한 소스 중 호출하는 Controller부모 Controller (Cmci_Controller)에서 로드하고 있습니다.

호출되는 Controller쪽에서는 따로 세션을 로드하고 있지 않습니다.

그리고 autoload에서도 로드하고 있지 않습니다.

아 그리고 메시지는 Unable to locate the specified class: Session.php 입니다.

한대승(불의회상) / 2017/01/13 11:24:42 / 추천 0

"Unable to locate the specified class: Session.php"

Session.php 파일을 지정된 위치에서 찾을수 없어서 표시된 에러 같은데요.

Cmci_Controller 에서는 session을 어떻게 로드 하고 있나요?

혜화꽃미미 / 2017/01/13 11:46:02 / 추천 0
class Cmci_controller extends CI_Controller{
	function __construct(){
		parent::__construct();

		//library 로드
		$this->load->driver('session');
	}
}

코드이그나이터 버전이 3.1.0 이어서 위와 같이 driver로 로드하고 있습니다.

한대승(불의회상) / 2017/01/13 13:00:14 / 추천 0

3.X 컨트롤러 로드 방식이 이전 2.X 로드방식과 달라 졌군요.

컨트롤러에서 컨트롤러를 직접 생성하여 사용하기는 힘들것 같습니다.

혜화꽃미미 / 2017/01/13 14:26:49 / 추천 0

아아 그렇군요.. 그럼 예전에 다른 분들 올려주신 글들은 전부 2.X 기준으로 작성된 글이었나보네요..

Controller에서 Controller 호출하는 부분이 안 되는건 아쉽지만, 그래도 평소에 잘 모르고 썼는데 Controller 로드될 때 동작원리에 대해 조금이나마 지식을 얻어가네요ㅎㅎ

어쨋든 여러차례 답변주셔서 정말 감사합니다:)