>  기사  >  백엔드 개발  >  Yii 프레임워크 구성 요소 분석 및 이벤트 동작 관리

Yii 프레임워크 구성 요소 분석 및 이벤트 동작 관리

不言
不言원래의
2018-06-19 14:19:342351검색

이 글에서는 Yii 프레임워크 구성 요소와 이벤트 동작 관리를 주로 소개하고, Yii 프레임워크 구성 요소 관리와 동작 관리의 원리와 사용 방법을 자세히 분석합니다. 도움이 필요한 친구들이 참고할 수 있습니다

이 글에서는 Yii 프레임워크 구성 요소와 이벤트 동작 관리에 대해 설명합니다. 예를 들어. 참고할 수 있도록 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

Yii는 대규모 웹 애플리케이션 개발을 위한 구성 요소 기반 고성능 PHP 프레임워크입니다. CComponent는 거의 모든 클래스의 기본 클래스입니다. 이 클래스의 메서드와 속성은 다음과 같습니다. $_e 데이터 저장 이벤트(evnet, 일부 위치에서는 Hook) 및 $_m 배열. 행동(행동)을 저장합니다.

구성요소 관리

YII는 많은 클래스의 멤버 변수가 보호되거나 비공개인 경우 PHP에서 속성에 액세스하고 설정하기 위해 __get() 및 __set()을 사용합니다. 방법은 그 이상을 수행합니다. 다음은 __get()을 사용하여 설명합니다

public function __get($name)
{
  $getter='get'.$name;
  if(method_exists($this,$getter))
    return $this->$getter();
  else if(strncasecmp($name,'on',2)===0 && method_exists($this,$name))
  {
    // duplicating getEventHandlers() here for performance
    $name=strtolower($name);
    if(!isset($this->_e[$name]))
      $this->_e[$name]=new CList;
    return $this->_e[$name];
  }
  else if(isset($this->_m[$name]))
    return $this->_m[$name];
  else if(is_array($this->_m))
  {
    foreach($this->_m as $object)
    {
      if($object->getEnabled() && (property_exists($object,$name) || $object->canGetProperty($name)))
        return $object->$name;
    }
  }
  throw new CException(Yii::t('yii','Property "{class}.{property}" is not defined.',
    array('{class}'=>get_class($this), '{property}'=>$name)));
}

CComponent 또는 해당 하위 클래스 객체 인스턴스 $obj->name일 때 __get($name) 메서드는 다음과 같습니다.

1 먼저 인스턴스에 getName이 있는지 확인합니다. () 메서드가 있으면 반환하고, 그렇지 않으면 2단계를 실행합니다. on으로 시작하는 이벤트는 일반적으로 CComponent 하위 클래스에 예약된 이벤트입니다. this,$name)은 해당 이름이 클래스의 인스턴스에 존재하는지 확인합니다. 존재하는 경우 이벤트를 반환합니다. 그렇지 않으면 3단계를 실행합니다.

3. 이름이 동작 배열에 있으면 변경된 동작을 반환합니다. 존재하지 않으면 3단계를 실행합니다. 4단계

4. 동작 배열을 탐색합니다. 배열의 동작은 CBehavior 하위 클래스의 인스턴스이고 CBehavior는 CComponent의 하위 클래스이므로 재귀 메서드를 사용하여 메서드를 가져옵니다. 그렇지 않은 경우 5

5단계를 수행하면 예외가 발생합니다. 요청한 속성이 존재하지 않습니다.

__get() 메서드는 CComponent 하위 클래스에서 오버로드될 수 있습니다. 예를 들어 구성 요소를 얻는 판단은 CModule에 추가됩니다. 이로 인해 문제가 발생합니다. 프로그램이 구성 요소를 먼저 로드하고 이름이 동일해야 하는 경우 getter를 사용해야 하기 때문에 동일한 이름을 사용하지 않는 것이 가장 좋습니다. 속성을 얻습니다.

public function __get($name)
{
  if($this->hasComponent($name))
    return $this->getComponent($name);
  else
    return parent::__get($name);
}

컴포넌트 로딩 및 생성과 관련하여 마지막 YII 프레임워크 분석 참고 1: YII 실행 프로세스의 3번 항목에 질문이 있습니다. 프레임워크의 핵심 컴포넌트를 등록할 때 한 번에 너무 많은 컴포넌트를 로드합니다. 성능에 영향을 미칠까요? 실제로는 아닙니다. 등록할 때 구성 요소와 해당 구성을 키-값 쌍의 형태로 배열에 저장하기만 하면 됩니다(미리 로드된 구성 요소 제외). 이를 사용하면 위와 같이 구성 요소를 생성할 수 있습니다. createComponent( in YIIBase ) 메소드를 통해 생성 및 초기화됩니다. 구성 요소를 얻기 위해 CModule 또는 그 하위 항목(예: CWebApplication)을 통해 __get() 또는 getComponent()를 호출할 때 CModule은 $_comComponents 배열을 통해 개체 풀을 설정하여 각 구성 요소가 요청에서 한 번만 인스턴스화되도록 합니다.

이벤트 동작 관리

이벤트는 구성 요소에 대한 확장 또는 플러그인과 동일합니다. 구성 요소에 예약된 후크는 구성 요소 외부에 대한 내부 호출을 구현하고 외부에서 구성 요소를 부분적으로 제어하는 ​​데 사용됩니다. CComponent 하위 클래스에서는 on으로 시작하는 메서드를 js의 onclick, onchange 등과 유사한 이벤트로 정의할 수 있습니다. 실제로 원리는 비슷합니다. 모든 이벤트는 CComponent와 동일한 파일에 있는 CEvent의 하위 클래스입니다.

/**
* Raised right BEFORE the application processes the request.
* @param CEvent $event the event parameter
*/
public function onBeginRequest($event)
{
  $this->raiseEvent('onBeginRequest',$event);
}
/**
* Runs the application.
* This method loads static application components. Derived classes usually overrides this
* method to do more application-specific tasks.
* Remember to call the parent implementation so that static application components are loaded.
*/
public function run()
{
  if($this->hasEventHandler('onBeginRequest'))
    $this->onBeginRequest(new CEvent($this));
  $this->processRequest();
  if($this->hasEventHandler('onEndRequest'))
    $this->onEndRequest(new CEvent($this));
}

예를 들어 CApplication에서 run() 메서드를 호출하는 경우 요청을 처리하기 전에 먼저 onBeginRequest 이벤트의 핸들이 외부로 전달되는지 확인합니다. 그렇다면 다음을 통해 CComponent에서 raiseEvent() 메서드를 호출합니다. onBeginRequest($event) 메소드를 사용하여 핸들을 실행합니다.

Behavior는 이벤트의 업그레이드 버전이며 모든 동작은 CBehavior의 하위 클래스입니다. 위의 __get() 메서드 분석 중 4단계를 분석하면 동작의 역할이 구성 요소의 특성(속성, 메서드, 이벤트, 동작 등)을 완전히 확장하여 프로그램 개발을 더욱 유연하게 만드는 것임을 알 수 있습니다.

비헤이비어의 또 다른 기능은 유사한 이벤트 핸들을 함께 배치하는 것입니다. 비헤이비어가 Attach() 메서드를 실행할 때 events() 메서드에서 반환된 이벤트 핸들을 바인딩하여 측면 관리 및 확장의 목적을 달성합니다. 예를 들어 CModelBehavior는 모델 관련 이벤트를 수집하여 하위 클래스를 쉽게 재사용할 수 있도록 모델에 동작을 추가해야 할 때 이를 상속할 수 있습니다.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!

관련 권장 사항:

yii 페이징 구성 요소 사용 정보


Yii 데이터 모델의 규칙 클래스 유효성 검사기 사용 정보


위 내용은 Yii 프레임워크 구성 요소 분석 및 이벤트 동작 관리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.