Controller

Controller 실행 순서

controllerframework의 구동을 제외한 솔루션의 기본 공통 작업부터 화면 출력까지의 업무를 관장합니다.

  1. view(템플릿 엔진) 설정
  2. Setup()
  • 해당 화면에서 사용될 interceptor 설정 (인증, 레이아웃 설정, 공통변수 설정 등)
  • 사용자 정의 데이터 설정 (추후 지원)
  1. pre() 실행 (사용자 정의 전처리)
  2. interceptor 실행 (시스템 전처리)
  • 설정된 interceptorpreHandle 메소드 실행
  • 환경설정에 등록된 순서에 따라서 순차적으로 interceptor 실행
  1. index()
  • 해당 Controller에서 실행되는 구문 (사용자 정의 가능 영역)
  1. interceptor 실행 (시스템 후처리)
  • 설정된 interceptorpostHandle 메소드 실행
  • 실행 순서는 interceptor 등록 역순
  1. post() 실행 (사용자 정의 후처리)
  2. fetch()
  • 구성된 view를 html로 수신
  1. render()
  • header를 설정한 후 수신된 html 데이터를 화면에 출력

Controller 상속 구조

  • AbstractController는 추상화를 목적으로 index(), setup(), pre(), post()의 추상 메서드가 설정되어 있으며 최종적으로 화면 출력을 담당합니다.
  • ActionController는 컨트롤러가 할 수 있는 action에 대해 정의되어 있습니다.
  • Controller는 위젯, 플러스샵, 헤더설정 및 Controller에서 사용하는 절대상수를 정의합니다.
  • Widget은 넓게 보면 컨트롤러 개념이지만 현 컨트롤러에 종속되어 부분적으로 프로그램+템플릿을 표현할 수 있습니다.

Controller Implement

  • 사용자(PC) 영역

    <?php
    namespace Bundle\Controller\Front\Test;
    
    class MyController extends \Controller\Front\Controller {
        public function index() {
            something();
        }
    }
    
  • 사용자(Mobile) 영역

    <?php
    namespace Bundle\Controller\Mobile\Test;
    
    class MyController extends \Controller\Mobile\Controller {
        public function index() {
            something();
        }
    }
    
  • 관리자 영역

    <?php
    namespace Bundle\Controller\Admin\Test;
    
    class MyController extends \Controller\Admin\Controller {
        public function index() {
            something();
        }
    }
    
  • 위젯 영역

    <?php
    namespace Bundle\Widget\Front\Test;
    
    class MyWidget extends \Widget\Front\Widget {
        public function index() {
            something();
        }
    }
    
  • api 영역

    <?php
    namespace Bundle\Controller\Api\Test;
    
    class MyController extends \Controller\Api\Controller {
        public function index() {
            something();
        }
    }
    

Controller Extends

User Source Directory

  • module/Controller/Front/Test/MyController.php
    <?php
    
    namespace Bundle\Controller\Front\Test;
    
    class MyController extends \Controller\Front\Test\Controller {
        protected function func() {
            return '456';
        }
    }
    
  • result
    [ 'test' => '456' ]
    

api

  • module/Controller/api/Test/MyController.php
    <?php
    
    namespace Bundle\Controller\Api\Test;
    
    class MyController extends \Controller\Api\Test\Controller {
        protected function func() {
            ...
        }
    }
    

Data Handling

controller의 index() 실행 후 interceptor 후처리를 통해 DataHandler interceptor가 실행 되면서 uri에 대응하는 위치에 있는 파일이 실행한다. 파일 안에서는 $data 변수를 통해 data를 가공할 수 있다.

ex) 사용자 소스 디렉토리(User Source Directory)goods/goods_list.php에 파일을 생성하고 다음과 같이 작성한다.

  • Bundle/Controller/Front/Goods/GoodsListController.php

    <?php
    namespace Bundle\Controller\Front\Goods;
    
    class GoodsListController extends \Controller\Front\Controller {
        public function index() {
            $this->setData('data', 'original');
        }
    }
    
  • goods/goods_list.php

    <?php
    
    $data['data'] = 'not original';
    $data['data2'] = 'new data';
    
  • result [ 'data' => 'not original', 'data2' => 'new data' ]

View Rendering

  1. View 출력 예제

    <?php
    namespace Bundle\Controller\[Front|Admin|Mobile]\Test;
    
    class MyController extends \Controller\[Front|Admin|Mobile]\Controller {
        public function index() {
            // somecode or data handling				
        }
    }
    
  2. JSON 출력 예제

    <?php
    namespace Bundle\Controller\[Front|Admin|Mobile]\Test;
    
    class MyController extends \Controller\[Front|Admin|Mobile]\Controller {
        public function index() {
            // case 1
            $this->setData('wrapper', [
                'test1' => 1,
                'test2' => 2,
                'test3' => 3,
            ]);
            $this->json();
    
            // case 2
            $data = [
                'wrapper' => [
                    'test1' => 1,
                    'test2' => 2,
                    'test3' => 3,
                ]
            ]);
            $this->json($data);
        }
    }
    
  3. 파일 다운로드 예제

    <?php
    namespace Bundle\Controller\[Front|Admin|Mobile]\Test;
    
    class MyController extends \Controller\[Front|Admin|Mobile]\Controller {
        public function index() {
            // 파일경로와 파일명을 인자로 넘기면 즉시 다운로드가 실행
            $this->download(UserFilePath::frontSkin('mera_ws','img','btn_19out.gif'), 'sample_test.gif');
        }
    }
    
  4. 스트림 파일 다운로드 예제

    <?php
    namespace Bundle\Controller\[Front|Admin|Mobile]\Test;
    
    class MyController extends \Controller\[Front|Admin|Mobile]\Controller {
        // index() 함수내 echo를 이용해 화면에 출력하면 출력 버퍼를 이용해 파일로 저장합니다.
        public function index() {
            // case 1
            echo '인덱스내에 스트링을 출력하면 해당 내용이 결과로 저장되며, 파일 확장자에 따라서 자동으로 Mime-Type이 설정됩니다.';
            $this->streamedDownload('sample_test.txt');
    
            // case 2
            echo '<table><tr><td>엑셀</td></tr></table>';
            $this->streamedDownload('sample_test.xls');
        }
    }
    
  5. 리다이렉트 예제

    <?php
    namespace Bundle\Controller\[Front|Admin|Mobile]\Test;
    
    class MyController extends \Controller\[Front|Admin|Mobile]\Controller {
        public function index() {
            $this->redirect('../order/cart');
        }
    }