CI 묻고 답하기

제목 헬퍼 선언의 위치
글쓴이 cleansugar 작성시각 2011/03/29 16:36:43
댓글 : 3 추천 : 0 스크랩 : 0 조회수 : 18095   RSS
$this->load->helper('form'); 는 컨트롤러와 뷰 중 어디에 넣는 게 나은가요?
 다음글 이미지가 안 나와요.. (11)
 이전글 트랜젝션 후의 알림 메세지 (1)

댓글

변종원(웅파) / 2011/03/29 16:48:51 / 추천 0

컨트롤러에 있는게 맞지 않을까요?
어떤 것은 컨트롤러에 있고, 어떤 것은 뷰에 있으면 관리상...
주로 뷰에서 사용이 되서 직관적이기는 할 것도 같지만 로직상 컨트롤러에 두는게 맞는것 같습니다.
매뉴얼에도 뷰에서 로드할 수 있지만 권장하지 않는다라고 되어 있습니다.

헛발이 / 2011/03/29 18:29:29 / 추천 0
초보자가 감히 의견을 적어 봅니다..

저도 그런 규정(?)이라고 하기엔 머하지만 뭐가 올바른 방법일까 아직도 고민 하고 있습니다. 약 1년간 이렇게도 해 보고 저렇게도 해보고 한 다음에 아직도 결론이 잘 나지 않는 부분이긴 하지만.. 저 같은 경우에는 이렇습니다.

예를 들어서 mdate()라는 핼퍼를 사용한다고 가정해 보면 이 핼퍼를 사용하기 위해
$this->load->helper('date');
를 로드 해야 합니다.

일단은 view에 넣는건 올바르지 않다고 생각됩니다. 나중에 생각해 보면 꼭 100%그렇게 해야 하는건 아니지만 view는 업무분담을 하게 되면 view는 디자이너 또는 코더가 해야 하는 부분이기 때문에 view에서는 단순히
<뷰에서>
echo $mydate;
만 넘겨 주는것이 좋습니다. 디자이너는 아무 생각 안하고 단순히 콘트롤러나 라이브러리에서 넘겨준 변수만 찍어 주게 해야 나중에 디자이너가 복잡해지지 않고 디자인을 수정하기도 수월하게 될것입니다.

그러면 $mydate가 콘트롤어에서 $mydate 값을 만들기위해 직접 콘트롤러에서
<콘트롤러>
$data['mydate'] = mdate('%Y/%m/%d', time());
를 하게 되는데 이 부분이 딱 한둔데서만 사용하게 된다면 해당 콘트롤러에서 메소드 부분에서 딱 한번만 로드 하면 된다고 생각됩니다. 정리를 하면
<콘트롤러에서>
class Test extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
    }

    function index()
    {
        $this->load->helper('date');
        $data['mydate'] = mdate('%Y/%m/%d', time());
    }
이렇게 하면 됩니다.
하지만 콘트롤 전체에서 사용하게 된다면 다음과 같이 상용하면 되겠구요..
<콘트롤러에서>
class Test extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
        $this->load->helper('date');
    }

    function index()
    {
        $data['mydate'] = mdate('%Y/%m/%d', time());
    }
    function page()
    {
        $data['mydate'] = mdate('%Y/%m/%d', time());
    }
하지만 여기저기서 막 쓰게 된다면 아마도 콘트롤러 보다는 라이브러리를 하나 만들어서 사용해도 된다고  생각합니다. 다시 말하면
<콘트롤러에서>
class Test extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
        $this->load->library('test_lib');
    }

    function index()
    {
        $data['mydate'] = $this->test_lib->mydate();
    }

<라이브러리>
class Test_lib
{
    function __construct()
    {
        $this->ci =& get_instance();
    }

    function mydate()
    {
        $this->ci->load->helper('date');
        return mdate('%Y/%m/%d', time());
    }
라이브러리 전체에서 사용하게 된다면
<라이브러리>
class Test_lib
{
    function __construct()
    {
        $this->ci =& get_instance();
        $this->ci->load->helper('date');
    }

    function mydate()
    {
        return mdate('%Y/%m/%d', time());
    }
이렇게 사용한느것도 가능합니다. 로드부분을 라이브러리가 아니고 콘트롤러에서 해 주고 사용해되 됩니다.
<콘트롤러에서>
class Test extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
        $this->load->helper('date');
        $this->load->library('test_lib');
    }

    function index()
    {
        $data['mydate'] = $this->test_lib->mydate();
    }

<라이브러리>
class Test_lib
{
    function __construct()
    {
        $this->ci =& get_instance();
    }

    function mydate()
    {
        return mdate('%Y/%m/%d', time());
    }


마지막으로 거의 모든 홈페이지에서 사용하게 된다면 그냥 쉽게 autoload에 설정해 주면 아주 편하죠~

이렇게 하면 된다고 생각됩니다.
꼭 이렇게 해야 한다 저렇게 해야 한다 라는건 없지만 저는 이렇게 생각하고 사용하고 있습니다.


cleansugar / 2011/04/05 22:56:43 / 추천 0

좀 여렵지만 여러번 읽어보겠습니다. 답변 주셔서 감사합니다.