목차
Yii的组件机制
(转自:http://zhangxugg-163-com.iteye.com/blog/1673325)
백엔드 개발 PHP 튜토리얼 (转)Yii的组件机制之一:组件基础类CComponent分析_PHP教程

(转)Yii的组件机制之一:组件基础类CComponent分析_PHP教程

Jul 13, 2016 am 10:27 AM
php

Yii的组件机制

 

组件机制,是Yii整个体系的思想精髓,在使用Yii之前,最应该先了解其组件机制,如果不了解这个机制,那么阅读Yii源代码会非常吃力。组件机制给Yii框架赋予了无穷的灵活性和可扩展性,可以毫不夸张地说,Yii框架的基础结构就是组件。大到CApplication对象、控制器、路由管理器(urlManager),小到一些其它插件,均是以组件形式存在的。

 

什么是Yii组件?

Yii中几乎所有可实例化并继承自CComponent的类,均可称为组件。

 

组件的特点是什么?

继承自CComponent类(直接继承或间接继承),拥有事件及行为机制,可在配置文件中定义其各个属性。

 

如何创建一个组件?

编写自定义类,并继承自CComponent类即可。

 

CComponent类是所有组件的基类,这个类在Yii框架中至关重要。具体来说,这个类主要实现以下三大功能:

1. 通过利用php的魔术方法__set, __get实现定义类的属性。也就是说一个组件的属性除了使用已经定义过的public成员属性,还可以利用CComponent实现的功能,通过扩展setXXX, getXXX方法扩展属性的设置和获取,对一些特殊的属性,我们可能希望在设置它之时就验证其是格式正确,此时就比较有用。
class webpage extends CComponent {

public $title;

private $_url;

public function setUrl($value='') {

if(is_url($value)){ 

$this->_url = $value;

}

}

public function getUrl() {

return $this->_url ;

}

}

 

$page = new webpage();

$page->title = "page title";

$page->url = "/index.php";  # call $page->seturl("/index.php");

echo $page->url   #$page->geturl();

 

也就是说,如果一个组件定义了setXXX, getXXX,那么就可以在类外部使用普通的属性访问形式。

 

2. 同样利用setter, getter实现事件处理接口绑定。事件机制在Yii中也是无处不大,Yii使用大量的事件机制来实现组件之间的功能调用(观察者模式)。

那么,如何给组件定义一个事件呢?Yii规定onXX形式的方法,即称为事件,如以下定义:
class form extends CComponent {

public function onSubmit($event) {

$this->raiseEvent('onSubmit',  $event);

}

}

 

使用以上固定代码,就给car组件创建了一个onStop事件。但是绑定事件究竟有何用处呢? 绑定事件的作用就是当组件产生一系列事件时,将自己的事件通过事件处理器,通知到绑定的各个对象上。例如我们希望当表单提交的时候,将此事件通知给日志组件让其记录之。

 

$form = new form();

$form ->attachEventHandler( 'onSubmit',  array($logOjbect, "saveLog") );

$form->data = $_POST;

$form->onSubmit( new CEvent($form, array('data'=>$_POST) ) ); #激活事件执行,并调用事件处理接口logObject::saveLog

logObject的代码可能如下:
class logObject {

public function saveLog($event) {

$event->sender === $form;

$event->params ;

}

}

 

显然这种方式远比传统方式调用更灵活,概念方式上也更先进一些。

另外,可以使用setter方法绑定事件:

$form->onSubmit = array($logOjbect, "saveLog") ;

注意:form类并未定义onSubmit成员属性。

同时,Yii实现了同一个事件绑定多个处理接口的机制,类似JavaScript中的addEventListener

 

事件处理器接口柳芽,以phpcallback类型格式为标准,详情参阅以下内容:http://php.net/manual/en/language.types.callable.php

 

YiiCLogRouter::init()中的代码:
Yii::app()->attachEventHandler('onEndRequest',array($this,'processLogs'));

当然也可以写成Yii::app()->onEndRequest = array($this,'processLogs');

CApplication中定义了onEndRequest事件:
public function onEndRequest($event){

if(!$this->_ended){

$this->_ended=true;

$this->raiseEvent('onEndRequest',$event);

}

}

 

定义了事件,并给事件绑定了处理器还不够,还得在合适的地方激活事件,如CApplication::run()方法中的逻辑:


public function run(){

if($this->hasEventHandler('onBeginRequest'))      

$this->onBeginRequest(new CEvent($this));

$this->processRequest();

if($this->hasEventHandler('onEndRequest'))

$this->onEndRequest(new CEvent($this));

}

 

也就说,要实现组件的事件机制,需要定义事件,绑定事件处理接口,激活事件

 

 

行为机制

yii的行为机制,可以简单地认为就是一个组件将其它对象的方法或属性直接拿来使用(就如php 5.4引入的trait结构,与行为作用就类似)

trait SayWorld {

    public function sayHello() {

        echo 'hello world!';

    }

}

class MyHelloWorld extends Base {

    use SayWorld;

}

$o = new MyHelloWorld();

$o->sayHello();

输出 hello world!

 

一个行为,就是一个特殊的类,其定义了各种事件及其处理流程,我们先定义一个行为类,包含事件及其对应的方法。

class MyAppBehavior extends CBehavior {    

    public $status = "app behavior ended.";    

    public function events() {

        return array(

            'onEndRequest' => 'appEnd',  #指定组件的onEndRequest事件发生后,调用行为的appEnd

        );

    }

    

    public function appEnd($event = null) {

        echo get_class($this);

    }

}

 

$app->attachBehavior('myapp','MyAppBehavior');

 

$app->run();

echo $app->status ;

 

我们发现行为的方法及属性,都是可以被组件直接使用的。

 

另外一个常见的例子,我们经常要对用户输入的内容进行过滤处理,比如防止其输入html标签,这种情况下,我们也可以考虑使用行为机制处理之。

 

$form = new FormModel;

If($_POST) {

$form->attributes = $_POST ;

$form->attachBehavior('myFilter', array(

'class' => '',

'strip_tags' => true ,

));

$form->filter(new CEvent($form) ) ;

}

 

class myHtmlFilter extends CBehavior {

public $strip_tags = false ;

public function events() {

return array(

'filter' => 'filterHtml',

);

}

 

public function filterHtml($event) {

if($event->sender instanceof CFormModel) {

$input = $event->sender->attributes ;

$event->sender->attributes = $this->filter($input);

}

}

 

public function filter(&$data) {

return is_array($data)?array_map(array($this, 'filter'),$data):strip_tags($data);

}

}

 

经过以上例子,可以发现行为方法可以以组件普通方法直接运行。行为有何用处,我目前还没有完全体会到其优势。

(转自:http://zhangxugg-163-com.iteye.com/blog/1673325)

yii的个人简单理解
组件:Yii中几乎所有可实例化并继承自CComponent的类,均可称为组件。
事件:类方法,供组件之间调用 已on开头作为标识
行为:特殊的类,供组件直接拿来使用,类似trait特性

 

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/815978.htmlTechArticleYii 的组件机制 组件机制,是 Yii 整个体系的思想精髓,在使用 Yii 之前,最应该先了解其组件机制,如果不了解这个机制,那么阅读 Yii 源...
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Dec 24, 2024 pm 04:42 PM

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP 날짜 및 시간 CakePHP 날짜 및 시간 Sep 10, 2024 pm 05:27 PM

cakephp4에서 날짜와 시간을 다루기 위해 사용 가능한 FrozenTime 클래스를 활용하겠습니다.

CakePHP 토론 CakePHP 토론 Sep 10, 2024 pm 05:28 PM

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

CakePHP 파일 업로드 CakePHP 파일 업로드 Sep 10, 2024 pm 05:27 PM

파일 업로드 작업을 위해 양식 도우미를 사용할 것입니다. 다음은 파일 업로드의 예입니다.

CakePHP 유효성 검사기 만들기 CakePHP 유효성 검사기 만들기 Sep 10, 2024 pm 05:26 PM

컨트롤러에 다음 두 줄을 추가하면 유효성 검사기를 만들 수 있습니다.

CakePHP 로깅 CakePHP 로깅 Sep 10, 2024 pm 05:26 PM

CakePHP에 로그인하는 것은 매우 쉬운 작업입니다. 한 가지 기능만 사용하면 됩니다. cronjob과 같은 백그라운드 프로세스에 대해 오류, 예외, 사용자 활동, 사용자가 취한 조치를 기록할 수 있습니다. CakePHP에 데이터를 기록하는 것은 쉽습니다. log() 함수는 다음과 같습니다.

PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 Dec 20, 2024 am 11:31 AM

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

CakePHP 빠른 가이드 CakePHP 빠른 가이드 Sep 10, 2024 pm 05:27 PM

CakePHP는 오픈 소스 MVC 프레임워크입니다. 이를 통해 애플리케이션 개발, 배포 및 유지 관리가 훨씬 쉬워집니다. CakePHP에는 가장 일반적인 작업의 과부하를 줄이기 위한 여러 라이브러리가 있습니다.

See all articles