CI 묻고 답하기

제목 다른 컨트롤러의 함수를 이용 하고 싶습니다.
카테고리 CI 2, 3
글쓴이 nataek 작성시각 2019/08/16 15:46:47
댓글 : 6 추천 : 0 스크랩 : 0 조회수 : 19442   RSS

다른 컨트롤러의 함수를 호출 하고 싶습니다.

검색 시 나온 답변 대로 해도 해결이 되지 않아 문의 드립니다.

다른 컨트롤러의 함수를 호출하고자 할 경우

<?php
 
require_once 'welcome2.php';
 
class Welcome extends Controller {
 
    function Welcome()
    {
        parent::Controller();  
    }
     
    function index()
    {
        $second  new Welcome2();
        echo $second->write();
    }
}

처럼 하면 된다 라는 답변을 보았는데요.

그대로 해보면 'Unable to locate the specified class: Session.php' 오류가 발생 하네요..

welcome2.php 를 CI 콘트롤러를 상속받지 않는 단순 클래스로 하면 저런 오류는 발생하지 않습니다.

하지만 welcome2.php 에서는 CI 콘트롤러의 기능을 사용 해야 하기 때문에 CI 콘트롤러를 상속 받아야 하는데요.

 

제가 무엇을 잘못 하고 있을까요?

조언 부탁 드립니다. 

감사 합니다.

 다음글 중복 코드 리팩토링 문의 (4)
 이전글 encryption 암호화 클래스(라이브러리)의 결과값...

댓글

kaido / 2019/08/16 15:52:55 / 추천 0

굳이 지적을 원하신다면... 상속 하시려는것 자체가 이미 문제의 시작입니다 ^^;

메뉴얼에서도 컨트롤러의 상속을 하는 방법이 없습니다.

이유는 해야할 이유가 없고, 상속시 생기는 문제점이 있기 때문입니다.

보시는것처럼 세션라이브러리 충돌 문제등이 있습니다.

 

가급적 회피는 해야 하나 답변만 하자면 

class Welcome extends Controller {}

==>

class Welcome {}

 

이미 welcom2.php가 extends 해서 contoller 를 로드해 왔는데 다시 contoller를 로드하려고 해서 나오는 문제입니다.

 

컨트롤러를 상속 시키는 방법 보다는 코어확장이나 라이브러리화쪽으로 작업 하시는것을 추천드립니다.

이러한 문제는 대부분 코어확장에서 간단히 해결되는 편입니다.

http://www.ciboard.co.kr/user_guide/kr/general/core_classes.html

nataek / 2019/08/16 16:25:40 / 추천 0

답변 감사 합니다..

그러면 제가 질문에 썼던 예시인 

https://www.cikorea.net/bbs/view/qna?idx=8617 의 댓글 답변은 잘못 된건가요?

kaido / 2019/08/16 16:59:37 / 추천 0

잘못보다는 CI 버전 차이도 있어보입니다.

해당 답변 버전은 보아하건데 CI 2.x 버전인걸로 보여집니다.

어느쪽이든 되냐 안되냐 보다는 하지 않는것이 좋습니다.

호짱 / 2019/08/16 23:53:22 / 추천 0

현재 방법에서 문제를 kaido님이 말씀해주셔서, nataek님이 하실려는 의도대로 다른방법을 추천드리자면.

Welcome 클래스에서 Welcome2 클래스를 상속하면 되지 않을까요?

Index 메서드는 override해서 사용하시고 그러면 자기 클래스인것 처럼 write메서드를 바로 사용하실수 있지 않을까요?

Welcome2가 CI core controller를 상속했기 때문에 Welcome도 컨트롤러로 역할하면서 Welcome2의 기능을 사용가능 할거에요.

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

require_once(APPPATH . "controllers/Welcome2.php");

class Welcome extends Welcome2 {

	public function __construct()
	{
		parent::__construct();
	}

    public index() {
        write();
    }

}

 

nataek / 2019/08/19 11:22:56 / 추천 0

kaido 님 답변 처럼 라이브러리로 문제 해결 하였습니다. 감사 합니다.

그런데 궁금한게 있습니다..

쓸데 없는 호기심 일지 모르겠으나...

CI 2.x 버전인걸로 보여집니다. 라고 답변 하신 것이 있는데..

그러면 CI 2.0 대 버전 에서는 제가 문의 드렸던 내용이 가능 했었고 저러한 오류도 없었나요?

저는 2.0대 버전은 사용을 해보지 않아서요..

kaido / 2019/08/19 11:40:48 / 추천 0

2.x 는 php 5.2 이하에서도 사용이 가능합니다.

3.x 는 php 5.3 이상.. 표준으로는 5.4 이상에서 정상 동작합니다.

가장 큰 기준으로 namespace 가 php 5.3 이상부터 지원이라서 2.x는 php의 레거시 형태를 눈물 나는 도전으로 가능한 표준형 코드로 작성하도록 만들어졌습니다.

코어의 생성 기준이 다르다보니, 코드 작성과 동작에서 약간 차이가 있습니다.