CI 묻고 답하기

제목 controller에러 질문입니다.
카테고리 CI 4 관련
글쓴이 sosomi 작성시각 2023/02/21 03:41:02
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 3885   RSS

안녕하세요. 개발자님들 개발을 이제 시작한 초보자입니다.

코드이그나이터 4.0.4에서 제작된 코드 예제를 차례로 버전업을 해보려고 시도하던 중에 좀 이상한 문제에 직면했습니다.

먼저

class BaseController extends Controller

{

public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)

    {

        helper('cookie');

        parent::initController($request, $response, $logger);

        $this->session = session();

        $this->db = db_connect();

        $this->setPopups();

       

        if(!$this->session->is_visited ) $this->insert_visit();

        $model = new UserModel('config');

        $this->skin['site_info'] = $model->where(['group'=>'basic', 'code'=>'info' ])->first()['data'];

        $this->setSkinType();

        $this->skin['header'] = $this->f_skin.'outline/header.html';

        $this->skin['footer'] = $this->f_skin.'outline/footer.html';

        if( $this->session->is_visited && !in_array( uri_string(), $this->session->view_page ) ){

            $this->add_pageView();

        }

        $heder_param = [

            'site_info' => $this->skin['site_info'],

            'layer_pop' => $this->popup['l'] ?? [],

            'header_pop' => $this->popup['h'] ?? [],

        ];

        echo view($this->skin['header'], $heder_param);

    }

    public function setSkinType()

    {

        $sql = 'SELECT `data` FROM `co_config` WHERE `group` = :group: AND `code` = :code:';

        $skin = $this->db->query($sql, ['group'=>'design','code'=>'skin'])->getRowArray();

        if($skin){

            $skin = json_decode($skin['data'], true);

        }else{

            $skin = ['Front'=>'Standard', 'Mobile'=>'Standard'];

        }

        $agent = $this->request->getUserAgent();

        switch($this->skin['site_info']['is_respon']){

            case 'responsive' :     // 반응형

                $this->f_skin = '/Front/'.$skin['Front'].'/';

            break;

            case 'adaptive' :       // 적응형

                if( $agent->isMobile() ) $this->f_skin = '/Front/'.$skin['Mobile'].'/';

                else $this->f_skin = '/Front/'.$skin['Front'].'/';

                //else $this->f_skin = '/Front/'.$skin['front'].'/';

            break;

        }

       

        $this->setData('f_skin', $this->f_skin);

    }

    public function setBody(array $page)

    {

        $this->skin['body'] = $this->f_skin.implode('/', $page).'.html';

    }

 

    public function setData($arg, $value=null){

        if (is_array($arg)) $var = array_merge($var=&$this->var_, $arg);

        else $this->var_[$arg] = func_get_arg(1);

    }

   

    public function getData($arg){

        return $this->var_[$arg];

    }

    public function __destruct()

    {

        $this->var_ = $this->var_ ?? [];

        echo view($this->skin['body'], $this->var_);

        echo view($this->skin['footer']);

        $this->db->close();

    }

}

basecontroller로 사용된 코드입니다. 해당코드를 extends하여

controller index에서는 setBody와 setData를 통해 셋팅만 해주면 해당페이지를 그려주게끔 구현했습니다.

codeigniter4.0.4에선 모든 페이지가 정상 동작합니다.

그런데 codeigniter4.0.5로 넘어가니 메인페이지만 정상 동작하고 다른페이지는 오류를 일으킵니다.

 

4.0.4와 4.0.5 모두 정상동작하는 메인페이지입니다.

<?php

namespace App\Controllers\Front\Main;

use App\Controllers\Front\FrontBaseController;

class MainController extends FrontBaseController

{

    public function index()

    {

        $this->setBody(['main','index']);

    }

}

 

4.0.4에선 db에 저장된 페이지를 불러와도 잘 동작하는데 4.0.5에선 db에 저장된 페이지를 불러오면 에러가 납니다.

하지만 에러코드에선 BaseController의

public function __destruct()
186     {
187         $this->var_ = $this->var_ ?? [];
188         echo view($this->skin['body'], $this->var_);
189         echo view($this->skin['footer']);
190         $this->db->close();
191     }

188번 라인에서 에러가 나는걸로 보아 body값 또는 data값을 제대로 가져오지 못하는것으로 파악되는데요.

4.0.4에서 4.0.5로 버전업하면서 생긴 문제인데 어떻게 해야될지 감이 오지않습니다.

직접적인 해결법은 모르더라도 중간에 controller단에서 변수들의 값들을 하나하나 찍어서 확인해볼수있는 방법이 있을까요?

단순 echo로는 그냥 디버그오류페이지가 떠서 값확인이 되지않아 답답합니다.

메인페이지에서 오류가 없어 4.2버전대까지 업그레이드하고 나서 돌다가 오류가 확인되서 하나하나 다시 뒤로가다 보니 4.0.5까지 다시 내려와 버렷네요... 코드가 부실해서 확실한 답변이 어렵다면 어떻게 값을 추적해나가야 하는지라도 알려주시면 열심히 해결해보겠습니다.

 다음글 전체 페이지에 공통 데이터 전달방법이 있을까요? (2)
 이전글 쿼리빌더로 부터 테이블의 컬럼이름을 추출하고 싶습니다. (1)

댓글

sosomi / 2023/02/21 07:41:50 / 추천 0

자문자답입니다.

4.0.4에서 4.0.5로 업그레이드시 mysqli드라이버가 변화하면서 like_json_extract()가 더이상동작하지 않게되었습니다.

그래서 db에서 값을 받아와 뷰를 그려줄때 like_json_extract()를 이용하게 되는데 이것이 문제가 되어 오류가 뜨는거였습니다.

해결법은 아직 확실하게 해결한것은 아니나 json을 직접 넘기거나 pdo드라이버를 사용하는 방식으로 수정하여 해결하면 될거같습니다.

sosomi / 2023/02/21 14:06:09 / 추천 0
해결했습니다. APP 내부의 사용자모델에 해당 메서드를 직접 구현해서 해결했습니다.