Yii framework

본 토픽은 현재 준비중입니다. 공동공부에 참여하시면 완성 되었을 때 알려드립니다.

Component

출처 : http://www.yiiframework.com/doc/guide/1.1/en/basics.component

Component 

  1.  Defining and using a Component Property
  2. Component Event
  3. Component Behavior

 Yii 어플리케이션은 사양에 기록된 객체 컴포넌트를 기반으로 구축되어 있다. 컴포넌트는 CComponent 또는 derived class의 인스턴스입니다. 컴포넌트를 사용하여 해당 속성을 액세스 하고 raising/handling 이벤트를 처리합니다. CComponent 기본 클래스에서 속성과 이벤트를 정의합니다.


1. Component 의 정의 및 사용  

 컴포넌트의 속성은 public의 멤버 변수와 같은 개체 입니다. 우리는 그 값을 읽거나 할당 할 수 있습니다. 예를들면 

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

컴포넌트 속성을 정의하는 두가지 방법이 있습니다.

첫번째 방법은 단순히 컴포넌트의 public 멤버 변수를 선언하는 것입니다.

class Document extends CComponent
{
    public $textWidth;
}

또다른 방법은 getters 와 setters 를 사용하는 것입니다. 또한 일반적인 속성은 읽기 또는 쓰기로 선언할 수 있기때문에  유연하게 사용할 수 있습니다.

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;

컴포넌트의 속성을 읽을 때 public 으로 선언되어 있지 않은 경우 Yii는 textWidth getter 메서드 getTextWidth 를 사용합니다. public 클래스 맴버로 정의 되지 않는 속성을 사용할때도 같은 현상이 발생 합니다.

getter 메서드가 있고 setter메서드가 없는 경우 컴포넌트의 속성은 읽기전용이 되고. 쓰려고 시도하는 경우에 예외 처리 합니다. 

반대의 경우는 쓰기 전용 입니다.

getter및 setter 메서드에 속성을 정의 하는 것의 이점은 읽기 및 쓰기를 실행할 수 있기 때문입니다.(예:유효성검사)

getter와 setter 는 메서드와 클래스 맴버변수에 약간의 차이가 있다 대/소문자 를 구분한다.


2. Component Event

 컴포넌트 이벤트(이벤트 핸들러라고도 불리기도한다)는 특별한 속성 입니다. 연결 메서드를 호출하면 자동으로 이벤트가 있는 장소로 이동 합니다. 따라서 컴포넌트의 동작을 수정할 수 있습니다. 예상 되는 동작을 컴포넌트에서  작성할 수 있다.

컴포넌트 이벤트는 그 이름으로 시작하는 메서드로 정의 할 수 있습니다. getter와 setter 메서드를 통해 정의 된 이름처럼 대소문자를 구분합니다 다음의 코드는 onClicked event 를 정의 합니다.

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

 여기서 $event은 CEvent 이벤트 매개 변수를 나타내는 자식 클래스의 인스턴스입니다.  다음과 같이이 이벤트 메서드를 첨부할 수 있습니다.

$component->onClicked=$callback;

 여기서 $callback 은 PHP를 불러옵니다. 전역함수 또는 클래스 메서드가 될 수 있습니다. 후자의 경우에 array: array($object,'methodName'). 처럼 지정해야 합니다. 

이벤트핸들러는 아래와같이 지정해야 합니다.

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

$event는 이벤트를 설명하는 매개변수 입니다. ( raiseEvent() 에서 유래됨) $event 매개변수는 CEvent 또는 클래스에서 파생된 인스턴스 입니다. 누가 이벤트를 발생 시키는 가에대한 최소한의 정보가 들어있습니다.

이벤트 핸들러는 PHP 5.3 이상에서 익명 함수가 될수 있습니다. 예를들면

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

onClicked()을 호출하면 연결된 이벤트 핸들러가 자동으로 실행 됩니다.

이벤트는 여러 핸들러와 연결할 수 있습니다. 이벤트가 발생할 때 핸들러는 이벤트에 연결된 순서대로 실행 됩니다. 핸들러가 호출될때 나머지 부분을 방지한다면 $event->handled 를 설정 할 수 있다.


3. Component Behavior

컴포넌트는 mixin pattern 을 지원하고 하나 또는 여러 behavior를 연결 할 수 있습니다. behavior는 일반적인  클래스의 다중상속이 가능합니다.

Behavior 클래스는 IBehavior 인터페이스를 구성해야 합니다. 대부분의 behavior는 CBehavior기본 클래스에서 확장이 가능합니다. 모델에 behavior를 연결하는 경우, CModelBehavior 또는 CActiveRecordBehavior를  모델에 기능을 추가 해야 합니다. 

behavior를 사용하려면 컴포넌트에서 attach() 을 호출해야 합니다.

다음예는 컴포넌트를 통해 behavior를 호출합니다.

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

behavior에서 컴포넌트의 속성을 사용 할 수 있습니다. 예를들어 behavior에서 tree는 컴포넌트에 연결 되어 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가 우선순위를 같습니다.

events와 behaviros를 함께사용할대 더 강력하게 작용합니다. behavior가 컴포넌트에 연결되면 컴포넌트의 이벤트 메서드를 연결할 수 있습니다.이렇게 함으로써 컴포넌트의 정상적인 실행 방향을 변경할수 있는 기회를 줍니다.

behavior 속성은 연결된 컴포넌트를 통해 액세스 할 수 있습니다. public 멤버 변수 와 getters and/or setters 는 behavior 를 통해 속성에 포함됩니다. 예를들어 behavior가 xyz라는 이름을 가진 속성과 연결되어 있으면  $a->xyz  이런방식으로 behavior에 액세스 할 수 있습니다.

댓글

댓글 본문
작성자
비밀번호
버전 관리
투리얼
현재 버전
선택 버전
graphittie 자세히 보기