Erzsamatory Weblog


※ 외국 문서 번역 자료입니다.

원문: Fundamentals - Component (http://goo.gl/Zof4n8)


속성 값 설정하기


Yii 어플리케이션에서는 광범위하게 특정한 어떠한 역할을 수행하는 컴포넌트가 사용됩니다. 컴포넌트는 CComponent 또는 CComponent 자식 클래스의 인스턴스를 말합니다. 컴포넌트는 각종 속성 값에 접근하거나 이벤트를 제어하는데 사용됩니다. 컴포넌트의 기본 클래스인 CComponent는 각종 속성과 이벤트를 어떻게 정의하는지 명시하고 있습니다.

컴포넌트 속성 값은 해당 객체의 공용 변수로 만들어 집니다. 개발자는 다음과 같이 속성 값을 설정하거나 불러올 수 있습니다.

$width=$component->textWidth;         // get the textWidth property
$component->enableCaching=true;       // set the enableCaching property

위 예제는 컴포넌트 속성 값을 설정하는 두 가지 방법을 보여주고 있습니다. 첫 번째 방법은 다음과 같이 아주 간단하게 클래스 내에 공용 변수를 정의하는 방법입니다.

class Document extends CComponent
{
    public $textWidth;
}

또 다른 방법은 생성자(setter)와 추출자(getter)를 이용하는 것입니다. 이 방법은 읽기 전용 또는 쓰기 전용으로 만들어진 속성 값을 제어하는데 아주 효율적으로 사용됩니다.

class Document extends CComponent
{
    private $_textWidth;
    protected $_completed=false;
    
    public function getTextWidth()
    {
        return $this->_textWidth;
    }
    
    public function setTextWidth($value)
    {
        $this->_textWidth=$value;
    }
    
    public function getTextHeight()
    {
        // calculates and returns text height
    }
    
    public function setCompleted($value)
    {
        $this->_completed=$value;
    }
}

위 예제에서 제시한 컴포넌트는 아래와 같이 사용됩니다.

$document=new Document();
    
// we can write and read textWidth
$document->textWidth=100;
echo $document->textWidth;
     
// we can only read textHeight
echo $document->textHeight;
     
// we can only write completed
$document->completed=true;


컴포넌트 속성 값이나 공용 변수로 선언되지 않은 속성 값을 불러올 때, 개발자는 해당 변수의 추출 메소드ㅡ위 예제에서 볼 때 textWidth의 추출 메소드는 getTextWidth입니다ㅡ를 사용할 수 있습니다. 이 방법은 공용 변수로 선언되지 않은 속성 값을 수정하거나 생성할 때에도 똑같이 적용됩니다.

만약 해당 컴포넌트에 어떤 설정 값에 대하여 추출 메소드는 있지만 생성 메소드가 없다면 그것은 해당 값이 읽기 전용인 것을 의미합니다. 따라서 개발자가 해당 값을 생성하거나 수정하려고 한다면 Yii Framework에서는 오류 메시지를 출력할 것입니다. 컴포넌트의 설정에는 읽기 전용 값만 있는 것이 아니라 쓰기 전용 값도 있습니다. 따라서 쓰기 전용으로 설정된 설정 값을 개발자가 읽으려고 하면 오류 메시지가 출력됩니다.

이와 같은 방법으로 컴포넌트 속성 값을 제어하면 유효성 검사나 이벤트 발생과 같은 추가적인 로직이 실행될 때 해당 값을 효율적으로 관리할 수 있습니다.


사용자 삽입 이미지


컴포넌트 이벤트


컴포넌트 이벤트는 이벤트 핸들러라는 이름을 가지는 메소드를 가지는 특수한 속성입니다. 이벤트 메소드를 해당 속성에 정의하면 해당 메소드는 자동으로 지정한 이벤트에 저장됩니다. 그러므로 컴포넌트를 개발하는 동안 이러한 방법을 통해서 해당 컴포넌트의 행동을 제어할 수 있습니다.

컴포넌트 이벤트는 on으로 시작하는 메소드를 정의함으로써 정의됩니다. 생성자와 추출자로 정의되는 속성 값과 같이 이벤트 이름 역시 알파벳 대소문자를 구분하지 않습니다. 다음은 onClicked 이벤트를 정의하는 코드입니다.

public function onClicked($event)
{
    $this->raiseEvent('onClicked', $event);
}

$event는 이벤트 속성을 가지는 CEvent 또는 CEvent 자식 클래스의 인스턴스입니다.

개발자는 다음과 같은 방법으로도 해당 이벤트에 메소드를 정의할 수 있습니다.

$component->onClicked=$callback;

$callback은 PHP 콜백 함수를 나타냅니다. 이것은 전역 함수 또는 클래스 메소드이어야 합니다. 후자의 경우, 콜백은 항상 배열ㅡarray ($object, 'method name')ㅡ로 주어져야 합니다.

이벤트 핸들러의 특징은 다음과 같습니다.

function methodName($event)
{
    ......
}

$eventraiseEvent()에서 이벤트를 생성할 때 사용되는 해당 이벤트를 저장하는 변수입니다. $eventCEvent 또는 CEvent에서 파생된 클래스의 인스턴스입니다. 최소한 이 변수는 어떤 곳에서 해당 이벤트가 실행되었는지에 관한 정보를 저장하고 있습니다.

PHP 5.3 이후 버전부터는 다음과 같은 이벤트 정의 방법이 가능합니다.

$component->onClicked=function($event) {
    ......
}

개발자는 onClicked()와 같이 메소드 방식으로 이벤트를 등록할 수도 있습니다.

한 개의 이벤트는 여러 개의 이벤트 핸들러를 가질 수 있습니다. 이벤트가 정의될 때, 이벤트 핸들러는 해당 이벤트에 정의된 순서대로 쌓이게 됩니다.

컴포넌트 행동 (Behaviour)


컴포넌트는 믹스인 패턴을 지원하고 한 개 또는 여러 개의 Behaviour가 적용될 수 있습니다. Behavior는 지정된 컴포넌트로부터 특수성이 아닌 기능만을 상속받은 클래스의 메소드를 가지고 있는 객체입니다. 컴포넌트는 여러 개의 Behavior를 적용할 수 있기 때문에 다중 상속을 지원한다고 말할 수 있습니다.

Behavior 클래스는 반드시 IBehavior 인터페이스가 적용되어야 합니다. 그리고 대부분의 Behavior는 CBehavior 기본 클래스로부터 확장됩니다. Behavior가 모델을 필요로 한다면, 모델에 관한 추가된 기능을 지원하는 CModelBehavior 또는 CActiveRecordBehavior를 통해서 해당 Behavior를 확장하면 됩니다.

Behavior를 사용하기 위해서는 컴포넌트의 Behavior를 생성하는 attach() 메소드를 통해서 해당 객체가 생성되어야 합니다. 다음과 같이 컴포넌트를 통해서 Behavior를 생성할 수 있습니다.

// $name uniquely identifies the behavior in the component
$component->attachBehavior($name,$behavior);
// test() is a method of $behavior
$component->test();

적용된 Behavior는 컴포넌트의 일반 속성 값을 통해서 접근할 수 있습니다. 예를 들어 tree라는 이름의 Behavior가 컴포넌트에 적용되었을 때, 개발자는 다음과 같은 방법으로 Behavior 객체를 얻을 수 있습니다.

$behavior=$component->tree;
// equivalent to the following:
// $behavior=$component->asa('tree');

Behavior는 다음과 같이 컴포넌트를 통해서 활성화될 수도 있고 비활성화될 수도 있습니다.

$component->disableBehavior($name);
// the following statement will throw an exception
$component->test();
$component->enableBehavior($name);
// it works now
$component->test();

두 개의 Behavior가 동시에 같은 메소드 이름을 가지고 있는 같은 컴포넌트에 적용될 수도 있습니다. 이 경우에는 첫 번째로 적용된 Behavior의 메소드가 우선됩니다.

이벤트 기능과 함께 사용될 때, Behavior는 더욱 강력해집니다. 컴포넌트에 적용된 Behavior는 해당 컴포넌트의 이벤트에 해당 Behavior의 메소드를 적용시킬 수 있습니다. 이렇게 함으로써, Behavior는 해당 컴포넌트의 작동 흐름을 변경하거나 읽어들일 수 있습니다.

Behavior의 각종 속성 값은 해당 Behavior가 생성된 컴포넌트를 통해서 접근할 수 있습니다. 이러한 속성 값은 공용 변수와 생성자와 추출자로 사용되는 내부 변수 모두를 가질 수 있습니다. 예를 들어 xyz라는 변수를 가지고 있는 어떤 Behavior가 $a 컴포넌트에 적용되었다고 가정하면, 개발자는 $a->xyz 와 같은 방법으로 해당 Behavior의 속성 값에 접근할 수 있습니다.


목차
1. 시작하기
     1-1. Yii란 무엇인가?
     1-2. 설치
     1-3. 아파치 웹서버와 Nginx 설정
     1-4. 첫 Yii 어플리케이션 생성

2. 기본 개념
     2-1. 모델-뷰-컨트롤러 (MVC)
     2-2. 엔트리 스크립트
     2-3. 어플리케이션
     2-4. 컨트롤러
     2-5. 모델
     2-6.
     2-7. 컴포넌트 (현재 페이지)
     2-8. 모듈
     2-9. 경로 별칭과 네임스페이스
     2-10. 일반 규칙
     2-11. 개발 흐름 (Workflow)
     2-12. MVC 예제

3. 양식(Form) 사용 연습
     3-1. 개요
     3-2. 모델 생성
     3-3. 액션 생성
     3-4. 양식 생성
     3-5. 테이블 추출
     3-6. 양식 생성기 사용하기

4. 데이터베이스 사용 연습
     4-1. 개요
     4-2. DB 액세스 객체
     4-3. 쿼리 빌더
     4-4. 동적 레코드
     4-5. Relational Active Record
     4-6. 데이터베이스 변환

5. 캐싱
     5-1. 개요
     5-2. 데이터 캐시
     5-3. 부분 캐시
     5-4. 페이지 캐시
     5-5. 동적 컨텐츠

6. Yii 확장
     6-1. 개요
     6-2. 확장 사용하기
     6-3. 확장 생성하기
     6-4. 써드파티 라이브러리 사용하기

7. 테스트
     7-1. 개요
     7-2. Defining Fixtures
     7-3. Unit Testing
     7-4. Functional Testing

원문: http://www.yiiframework.com/doc/guide/
http://www.erzsamatory.net/trackback/39

건전한 댓글 문화를 만들어주시기 바랍니다 ^^
불건전한 댓글이 등록되는 경우 관리자의 임의적 판단으로 삭제될 수 있음을 미리 공지드립니다.

비밀글로 작성하기