CI 묻고 답하기

제목 매번 같은 작업을 하는 기능을 trait 를 사용해 공통적으로 사용할수 있게 만들려고 합니다.
카테고리 CI 2, 3
글쓴이 마카오최 작성시각 2017/06/14 21:14:56
댓글 : 6 추천 : 0 스크랩 : 0 조회수 : 12972   RSS

보통 저의 경우

class Board extends CI_Controller{  }

이런식에서 list(), view(), delete(), write(), modify() 등등 추가하여 사용하는데,

사실 이게 대부분 새로 만드는 컨트롤러에도 모두 거의 항상 똑같이 포함되고 저 안에 요소들을 각각에 맞게 다듬는 정도로 작업하게 됩니다.

그래서 일단 뭔가 새로운 컨트롤러를 만들어야겠다 그러면 비슷한 컨트롤러 복사해다가 붙여놓고 작업하였습니다.

그런데 이게 과연 맞나 싶고... 반복 코드를 줄이고 기능만을 위한 정적 클래스?를 따로 만들려고 하는데

PHP의 trait 가 딱이다 싶더라구요.

그런데 trait 파일의 위치를 어디다가 두어야 할지 모르겠네요.

composer.json 쪽에다가 경로 기록하고 vendor 디렉토리에 위치시켜야 하나요?

이 경우는 나중에 아무생각없이 배포 파일에서 composer install 하면 git에 공유도 안되있으니 에러만 나올것 같고.. 

어디에 위치시켜야 한방에 로드 되면서 자연스럽게 맞아떨어질까요?

그냥 index.php에 필요한 trait 파일 만들어서 include를 시켜야 하나요? ㅠ

태그 트레이트,trait
 다음글 쿼리문을 phpMyadmin에서 출력하면 원하는값을 잘... (2)
 이전글 폼이 post로 있을 경우 새로고침 시 경고창 문제 (3)

댓글

kaido / 2017/06/14 21:30:39 / 추천 0

방법은 많습니다만...

우선 고민하고 계신 trait 부분 부터.

이부분이 왜 고민인지 개인적으로 이해가 어렵습니다.

composer 를 알고 계시고 trait 를 알고 계시다면 auto load 를 이해하고 계시단 건데...

이게 왜 고민이 되는 것이죠?

 

composer를 쓰는거고, 공통된 객체 기능을 끌어다 쓰기 위해서 auto load 시킨다면...

매번 use 로 호출 해서 불러올텐데, 왜 에러가 나신다는 건지...?

어느쪽이든 사용하려는 객체를   불러와서 콜 하지 않으면 사용이 불가능 합니다.

 

2번째로 좀더 쉽게 사용 하는 방법중 하나는 컨트롤러를 코어확장 해서 사용 하시면 됩니다.

코어확장 부분에다 trait 넣으셔도 되구요.

 

의문은 풀리셨나요? ㅎㅎ

마카오최 / 2017/06/14 22:32:50 / 추천 0

kaido 님 안녕하세요.

질문 해놓고 kaido님 답변을 보니, composer.json 파일의 경로를 기록한다는것 자체가 외부 git 라이브러리를 연동하는것인데

외부 git 라이브러리도 아닌데 저기에 작성할 이유가 없겠네요..

"vendor 디렉토리는 보통 git에 푸쉬할때 제외 시키기 때문에 배포 솔루션을 다운받은 사람은

composer install 또는 update 명령을 실행시켰을 경우 제가 vendor 디렉토리에 따로 직접 추가한 파일은 git에 공유되어있지 않으니

composer.json에 기록한 경로가 존재 하지 않아 다운받을 곳이 없어 에러가 난다 " 라는 착각을 했네요.;;

애초에 git에 공유시킨것도 아닌데 composer.json 에다가 왜 경로를 적을 생각을 한건지 ㅜㅜ

잠깐 미쳤었나 봅니다..;;

 

코어 확장 부분에다가 trait 넣는 다는 것은 아래와 같이 한 파일에 넣는 것을 말씀 하시는 건가요?

trait Hello {
    public function sayHello() {
        echo 'Hello ';
    }
}

class MY_Controller extends CI_Controller {
    use Hello;
}

 

이렇게 하면 MY_Controller가 Hello 트레이트를 포함하니 이것을 다시 확장한 사용자정의 컨트롤러 예) Board를 만들면 trait 의 모든 메소드를 사용할수 있고 정말 좋겠네요.

class Board extends MY_Controller {
   echo $this->sayHello();
}

이해한게 맞는지 모르겠는데 좋은 방법인것 같습니다.

kaido / 2017/06/15 05:51:49 / 추천 0

네. 이해하신게 맞습니다.

다만 trait를 사용 하지 않고  코어 확장에다가 function 으로 기능 집어 넣고

function으로 불러다가 호출 하면 더 쉽게 된다는 것은 함정. ㅎㅎ

 

2번째 함정으로는 composer 사용 하니

굳이 코어확장 안하고 컴포저 스타일로 만들어서 따다가 쓰면 된다는 것도 함정.

 

3번째로는 라이브러리로 만들어도 별반 차이 없다는 것도 함정 입니다.

 

방법은 많고, 스타일만 다를뿐이죠.

한대승(불의회상) / 2017/06/15 08:37:53 / 추천 0
MY_Controller에 공통으로 사용되는 메소드를 정의한 후 상속을 MY_Controller로 받아도 됩니다.
양승현 / 2017/06/15 18:42:27 / 추천 0
ㅎㅎ 지금은 엄철 편해졌군요.
예전엔 컨트롤러 모델 뷰를 만드는 관리자를 만들어 프로젝트에 따른 파일들을 자동생성하여 개발저들에게 배포하고 사용했었는데요 ㅎㅎ

다시 공부시작 ㅜ.ㅜ
마카오최 / 2017/06/16 10:36:09 / 추천 0

kaido, 한대승, 양승현 님 답변 감사합니다.

말씀들을 듣고 보니 굳이 트레이트 아니더라도 얼마든지 다양한 방법이 있었네요.

쉽게 갈것을 이상하게 생각하고 있었나 봅니다;;

이중에 어떤 방법이 지금 현재 상황에 적절한 방법인가 고민하여 적용해 보겠습니다.ㅎ