출처 : http://www.yiiframework.com/doc/guide/1.1/en/basics.controller
Controller
- Route
- Controller Instantiation
- Action
- Filter
yii framework 의 Controller는 View와 Model 그리고 Wiget의 도움으로 사용자 요청을 받아 응답하는 클래스 입니다.
작업방법은 간단한 형태로 이름으로 시작하는 컨트롤러 클래스 입니다.
컨트롤러는 기본 동작을 가지고 있습니다. 작업을 지정하지 않은 경우에는 기본적으로 설정 된 동작이 실행 됩니다.
일반적인 요청 URL
http://example.com/index.php?r=ControllerID
아래 코드는 사이트 컨트롤러 동작을 정의하는 부분입니다.
class SiteController extends CController { public function actionIndex() { //Example echo 'Hello Index'; } public function actionContact() { //Example echo 'Hello Contact'; } }
actionIndex() 에 정의된 내용은 아래 URL에서 확인이 가능하다.
http://example.com/index.php?r=site/index
마찬가지로 actionContact()에 정의된 내용은 아래 URL에서 확인이 가능하다.
http://example.com/index.php?r=site/contact
1. Route(경로)
컨트롤러와 액션은 아이디로 식별 합니다.
컨트롤러 클래스 파일경로는 protected/controllers/path/to/XyzController.php
이 액션 ID는(Xyz) 접두사가없는 이름이어야 합니다.
actionEdit 라는 메서드가 포함된 경우에 해당 작업의 ID가 수정됩니다.
경로는 / 로 구분하며 controller ID 그리고 action ID 연결에 의해 형성됩니다.
예를들면 아래와같은 URL로 게시물 컨트롤러와 편집 작업을 요청한다.
http://example.com/index.php?r=post/edit
:: 참고로 routes 는 대소문자를 구분합니다. CUrlManager::caseSensitive에서 설정하여
대소문자를 구분 할 수 있습니다.
어플리케이션은 모듈을 포함 할 수 있습니다.
모듈 컨트롤러 액션에 대한 경로 moduleID/controllerID/actionID (자세한내용은 module에 대한 섹션을 참조)
2. Controller Instantiation(컨트롤러 인스턴스화)
CWebApplication 이 들어오는 요청을 처리할 때 컨트롤러 인스턴스가 만들어 집니다.
어플리케이션 규칙과 위치는 클래스 파일에 있습니다.
- CWebApplication::catchAllRequest 가 지정되어 있는 경우 컨트롤러는 이 속성에 따라 생성되며, 사용자가 지정한 controller ID는 무시 됩니다. ( 주로 유지 보수 모드에서 어플리케이션을 notice page를 표시하는데 사용합니다.)
- ID가 CWebApplication::controllerMap 에서 발견되는 경우 컨트롤러의 구성은 컨트롤러 인스턴스를 생성하는데 사용됩니다.
- 경로('path/to/xyz')에 ID가 있는 경우 컨트롤러 클래스 이름은 Xyzcontroller 라고 가정하고 해당클래스 파일의 위치는 protected/controllers/path/to/XyzController.php. 예를들어 컨트롤러 ID admin/user는 UserController 및 클래스 파일에 매핑 될 것 입니다. protected/controllers/admin/UserController.php. 클래스 파일이 존재하지 않을 경우에는 404 CHttpException 이 발생합니다.
3. Action
액션은 그이름으로 시작하는 방법이 있습니다 하지만 더 좋은 기술은 액션 클래스를 재정의 하는 것입니다.
컨트롤러 인스턴스화 하는 것을 요청 하는 경우 액션을 재사용 할 수 있습니다.
새로운 액션 클래스를 정의 하는 방법 입니다.
class UpdateAction extends CAction { public function run() { // place the action logic here } }
액션을 컨트롤러가 인식할 수 있도록 action()를 오버라이드 합니다.
class PostController extends CController { public function actions() { return array( 'edit'=>'application.controllers.post.UpdateAction', ); } }
위에서 경로(protected/controllers/post/UpdateAction.php.)를 application.controllers.post.UpdateAction 사용 액션 클래스 파일로 지정
클래스 기반 작업을 작성하여, 우리는 모듈 방식으로 어플리케이션을 구성 할 수 있습니다.
예를 들어, 다음 디렉토리 구조는 컨트롤러에 코드를 구성하는 데 사용할 수 있습니다.
aprotected/
controllers/
PostController.php
UserController.php
post/
CreateAction.php
ReadAction.php
UpdateAction.php
user/
CreateAction.php
ListAction.php
ProfileAction.php
UpdateAction.php
Action Parameter Binding(액션 매개변수 묶기)
Since version 1.1.4 에서 부터는 자동 작업 매개변수 묶기에 대한 지원을 추가했습니다. 컨트롤러의 액션 메서드는 명명된 매개변수를 정의 할 수 있습니다. 그 값은 자동으로 $_GET에서 채워집니다.
어떻게 작동하는 지는 PostController 를 작성하며 설명합니다.
액션에는 두개의 매개변수가 필요합니다.
- category:새 게시물의 정수값
- language:새 게시물이 확대될??? 것을 나타내는 문자열
$_GET에서 필요한 매개변수 값을 검색하기 위해 다음과같은 코드로 해결 할 수 있습니다.
class PostController extends CController { public function actionCreate() { if(isset($_GET['category'])) $category=(int)$_GET['category']; else throw new CHttpException(404,'invalid request'); if(isset($_GET['language'])) $language=$_GET['language']; else $language='en'; // ... fun code starts here ... } }
이제 이 기능을 사용해 우리가 원하는 작업을 수행 할 수 있습니다.
class PostController extends CController { public function actionCreate($category, $language='en') { $category=(int)$category; // ... fun code starts here ... } }
actionCreate 에 두개의 매개변수를 추가 할 것을 알 수 있습니다. 이 매개변수는 $_GET에서 지정한 이름과 동일해야 합니다. $language 는 매개변수를 포함하지 않는 경우 기본값을 사용 $category는 기본값이 없기 때문에 CHttpException (error code 400) 가 발생합니다.
version 1.1.5 부터는 매개 변수 배열 형식 감지를 지원합니다. 아래와 같은 코드를 입력합니다.
class PostController extends CController { public function actionCreate(array $categories) { // Yii will make sure that $categories is an array } }
매개변수 선언할 때 앞에 키워드 array를 추가합니다. $_GET['categories']는 해당문자열로 구성된 배열로 변환 됩니다.
::Note 배열형식이 선언되지 않는 경우에는 $ _GET 통해 배열 매개 변수를 전달하는 HTTP 예외가 발생합니다.
version 1.1.7 부터는 자동매개변수 바인딩은 class-based actions.에 의해 작동합니다.
액션클래스의 run()가 몇가지의 매개변수로 정의 될때 요청한 매개변수 값으로 채워집니다.
class UpdateAction extends CAction { public function run($id) { // $id will be populated with $_GET['id'] } }
4. Filter
필터는 컨트롤러 액션이 실행되기 전이나 후에 실행되도록 구성된 코드입니다.
예를들어 액세스 제어 필터는 사용자가 요청 된 작업을 실행하기 전에 인증되었는지 확인하기 위해 실행 할 수 있고, 성능 필터는 작업을 실행하는데 걸린 시간을 측정하는데 사용 할 수 있습니다.
액션은 여러개의 필터를 가질 수 있습니다. 필터는 목록에 나타나는 순서대로 실행 됩니다.
필터는 액션과 나머지 필더를 실행되지 않고록 방지 할 수 있습니다.
필터는 컨트롤러 클래스 메서드로 정의 할 수 있습니다. 필터는 메서드 이름으로 시작해야 합니다.
예를들면 filterAccessControl라는 메서드는 AccessControl를 정의합니다.
필터는 올바른 서명이 필요합니다.
public function filterAccessControl($filterChain) { // call $filterChain->run() to continue filter and action execution }
위에서 $filterChain 은 요청된 조치와 필터 목록을 나타내는 CFilterChain 의 인스턴스 입니다.
필터 메서드 안에서 $filterChain->run() 를 호출 할 수 있습니다. 필터및 작업 실행을 계속 합니다.
필터는 CFilter 의인스턴스나 하위 클래스의 인스턴스가 될 수 있습니다.
아래 코드는 새로운 필터 클래스를 정의 합니다.
class PerformanceFilter extends CFilter { protected function preFilter($filterChain) { // logic being applied before the action is executed return true; // false if the action should not be executed } protected function postFilter($filterChain) { // logic being applied after the action is executed } }
필터를 적용하려면 CController::filters() 메서드를 재정의 해야 합니다.
필터 메서드의 배열을 반환 합니다. 아래 예입니다.
class PostController extends CController { ...... public function filters() { return array( 'postOnly + edit, create', array( 'application.filters.PerformanceFilter - edit, create', 'unit'=>'second', ), ); } }
위에서는 두가지 필더를 지정합니다. postOnly, PerformanceFilter.
application.filters.PerformanceFilter 는 경로protected/filters/PerformanceFilter 의 클래스 파일임을 의미합니다. 필터 속성은 second로 초기화 합니다.
+, - 연산자를 사용하여 액션필터를 적용할 수 있습니다.PerformanceFilter 를 재정의하는 동안 + - 는 작업에 포함됩니다.