婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Yii Framework框架中事件和行為的區(qū)別及應用實例分析

Yii Framework框架中事件和行為的區(qū)別及應用實例分析

熱門標簽:咸陽電銷 濟源百應電銷機器人聯(lián)系方式 嘟嘟云外呼系統(tǒng) 重慶外呼電銷系統(tǒng)多少錢 邢臺400電話辦理 正規(guī)電銷機器人系統(tǒng) 辦理400電話哪家好點 南寧電話外呼系統(tǒng)線路 南京3D地圖標注

本文實例講述了Yii Framework框架中事件和行為的區(qū)別及應用。分享給大家供大家參考,具體如下:

個人覺得,在 Yii 里面,最難以明白的就是事件(Event)和行為(behavior)了。這不僅僅是因為它們的概念

比較難明,關鍵是它們的應用場景比較難明,不知道什么時候應該使用事件和行為來開發(fā)。

關于 Yii 的事件和行為的描述,可參考 http://www.yiiframework.com/doc/api/1.1/CComponent

本文參考的文章:

http://www.larryullman.com/2010/07/20/forcing-login-for-all-pages-in-yii/
http://www.yiiframework.com/wiki/44/behaviors-events/

事件

事件模型就是設計模式中的“觀察者模式”:當對象的狀態(tài)發(fā)生了變化,那么這個對象可以將該事件通知其它對象。
為了使用事件模型,需要實現(xiàn)這三個步驟:1、定義事件;2、注冊事件句柄;3、觸發(fā)事件。

為什么要做這三個步驟呢?因為對于 PHP 本身,它的執(zhí)行過程不是以進程化來運行的,
所以 Yii 的事件觸發(fā)機制不會像 ActionScript 3+ 那樣,直接將觸發(fā)事件。
有人說,Yii 的事件概念跟 js 中的事件概念差不多,因為 Yii 是將事件綁定到 Yii::app() 的執(zhí)行過程中。
由于本人對于 js 的事件沒有做過深入的了解,這里不敢貿(mào)然否定,或者肯定。

費話少說,先看這樣的應用場景:

我想在請求過來的時候,先將請求的 IP 的記錄到數(shù)據(jù)庫,然后才進行對應的相應的請求處理。

1. 通過編輯 components/Controller.php 的構造方法來處理。

如代碼:

class Controller extends CController
{
  public function __construct()
  {
    parent::__construct();
    //將請求的 IP 記錄到數(shù)據(jù)庫
  }
}

2. 通過使用事件來處理。

我們來分析一個 framework/base/CApplication.php 的 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 首先會判斷一下當前有沒有處理 onBeginRequest 的函數(shù)或者類的方法綁定了,

如果有這樣的函數(shù)或者類的方法存在,則先執(zhí)行了它們,然后再處理請求。

那么,怎樣寫 onBeginRequest,或者怎樣去調用呢?

方法一:修改 index.php

一般來說,我們的 index.php 最后一句是:

Yii::createWebApplication($config)->run();

我們在這里將它改造一下,改成:

$app = Yii::createWebApplication($config);
Yii::app()->onBeginRequest=function($event) {
  //將請求的 IP 記錄到數(shù)據(jù)庫
};
Yii::app()->onBeginRequest=function($event) {
  //其它的你想要處理的內(nèi)容,比如說,生成一個文件
  //file_put_contents('onBeginRequest.txt', '阿媽,我得左啦!');
};
$app->run();

方法二:在配置文件 main.php 里面注冊事件

如:

/***************************************************
在我們想要的內(nèi)容的前后出現(xiàn)了這些代碼
只是為了說明,我們添加的內(nèi)容是要放在
這個配置數(shù)據(jù)的一維里面。
'import'=>array(
  'application.models.*',
  'application.components.*',
  'application.helpers.*',
),
'defaultController'=>'post',
***************************************************/

//其它代碼
'import'=>array(
  'application.models.*',
  'application.components.*',
  'application.helpers.*',
),

/************** 這才是我們想要添加的代碼 **************/
'onBeginRequest' => array('MyEventHandler', 'MyEventHandlerMethod'),

'defaultController'=>'post',
//其它代碼

關于 onBeginRequest 的使用,它必須是一個有效的 PHP 回調。

即,一個指匿名函數(shù),全局函數(shù)名的字符串或一個數(shù)組。如果是數(shù)組,那么該數(shù)組包含兩個元素,第一個元素是一個對象,第二個元素是這個對象的方法。
由此可見,方法一和方法二還是有點區(qū)別的。使用方法二的時候,只能注冊一個 PHP 回調,而使用方法一,可以是不同的 PHP 回調。當然,這里說的方法二
只能注冊一個 PHP 回調是指,對整個請求處理過程中肯定會執(zhí)行的 PHP 回調,在其它地方需要的時候,也可以加上你想實現(xiàn)的功能。

3. 另一個例子,來說明自己是怎樣定義一個事件的。

打開 models/ContactForm.php,輸入

/**
 * 自己定義發(fā)送郵件事件
 * @param unknown_type $event
 */
public function onSendMail($event)
{
  $this->raiseEvent('onSendMail',$event);
}

/**
 * 驗證成功,執(zhí)行
 * @see CModel::afterValidate()
 */
public function afterValidate() 
{
  if($this->hasEventHandler('onSendMail'))
    $this->onSendMail(new CEvent($this));
}

這里我們定義了一個 onSendMail 事件,并在 Validate 驗證后,觸發(fā)此事件。

打開 controllers/SiteController.php,將修改actionContact修改為以下內(nèi)容

public function actionContact()
{
  $model=new ContactForm;

  $model->onSendMail=function($event) {
    $headers="From: {$event->sender->email}\r\nReply-To: {$event->sender->email}";
    mail(Yii::app()->params['adminEmail'],$event->sender->subject,$event->sender->body,$headers);
  };

  if(isset($_POST['ContactForm']))
  {
    $model->attributes=$_POST['ContactForm'];
    if($model->validate())
    {

      Yii::app()->user->setFlash('contact','Thank you for contacting us. We will respond to you as soon as possible.');
      $this->refresh();
    }
  }
  $this->render('contact',array('model'=>$model));
}

上面的 3 點,雖然通過綁定事件來做一些額外的處理,但同時已經(jīng)暴露了一個問題,就是協(xié)同開發(fā)的時候,我不一定知道,

其他開發(fā)人員寫了哪些事件的 PHP 回調,在處理過程中到底會調用哪些事件的 PHP 回調。或者說,這個 PHP 回調在什么時候創(chuàng)建的,

或者說你在為組件添加事件處理函數(shù)時,找不到合適的時候,如果添加早了,組件還沒創(chuàng)建,如果添加晚了,事件不被執(zhí)行,有可能組件已經(jīng)執(zhí)行完了。

我們需要一個類似于配置文件的東西,將存在的事件處理組織起來,統(tǒng)一管理。這個時候,行為可以用上了。

行為

這里先重新描述一下為什么要使用行為。

有兩種辦法可以對類添加特性:

1、直接修改這個類的代碼,添加一些成員函數(shù)和成員變量;
2、派生,通過子類來擴展。

很明顯第二種方法更加易維護、易擴展。但是如果需要對一個類添加多個特性(多人在不同時期),那么需要進行多級派生,這顯然加大了維護成本。

在 Yii 里面,通過行為類綁定,組件將一個或多個 CBehavior 類的成員方法和成員變量添加到自己身上,并且在不需要的時候載掉某些 CBehavior 類。

同時,可以通過重寫 CBehavior::events 的方法,來實現(xiàn)對目標類的多個事件綁定。這些事件將會在當前行為綁定到目標類的時候,一起被綁定上。

下面我們以代碼來具體看一下這個行為特性。

在 protected 創(chuàng)建目錄 behaviors,并在protected/behaviors目錄下創(chuàng)建ApplicationBehavior.php,輸入如下代碼:

?php
class ApplicationBehavior extends CBehavior 
{

  public function events()
  {
    return array_merge(parent::events(),array(
        'onBeginRequest'=>'beginRequest'
    ));
  }

  public function beginRequest($event) 
  {
    echo "我已經(jīng)將 onBeginRequest 的事件處理通過行為綁定了";
  }
}

此行為文件,是要為 CApplication 服務,仔細查看這個行為文件,我們可以看到,events 方法定義了些行為可以處理的事件,

上面的類,可以處理 onBeginRequest 事件,當然如果你自己定義的組件也有一個叫做 onBeginRequest 方法,你也可以使用此行為

后面的 beginRequest 就是事件的處理函數(shù),這個處理函數(shù)必須要有行為類中定義。

跟上面的事件一樣,也有兩種方法將此行為類附加到 CApplication。

方法一:

打開 index.php,輸入下面代碼

$app = Yii::createWebApplication($config);
Yii::app()->onBeginRequest=function($event) {
  //將請求的 IP 記錄到數(shù)據(jù)庫
};
Yii::app()->onBeginRequest=function($event) {
  //file_put_contents('onBeginRequest.txt', '阿媽,我又得左啦!');
};
/****** 這句才是我們想要的東東 *********/
$app->attachBehavior('app', 'application.behaviors.ApplicationBehavior');
$app->run();

刷新頁面,你將會在頭部看到一行 “我已經(jīng)將 onBeginRequest 的事件處理通過行為綁定了”

方法二:

如果對 Yii 的組件定義了解的話,應該知道每一個組件,都有一個behaviors方法,該方法中定義的相關行為,在組件初始化時,會自動附件,

下面我們就為 CApplication 定義 behaviors,由于 CApplication 是系統(tǒng)級類,我們可以擴展此類,并添加behaviors方法。這里補充一下,

CApplication 是會根據(jù) config/main.php 配置進行初始化,那么我們就可以將 behaviors 定義在 main.php。

打開 protected/config/main.php,加入如下代碼:

'behaviors' => array(
  'app' => 'application.behaviors.ApplicationBehavior',
),

刷新頁面,你也會在頭部看到一行 “我已經(jīng)將 onBeginRequest 的事件處理通過行為綁定了”

通過以上的例子,希望相關讀者對 Yii 的事件和行為有一定的了解。

更多關于Yii相關內(nèi)容感興趣的讀者可查看本站專題:《Yii框架入門及常用技巧總結》、《php優(yōu)秀開發(fā)框架總結》、《smarty模板入門基礎教程》、《php面向對象程序設計入門教程》、《php字符串(string)用法總結》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》

希望本文所述對大家基于Yii框架的PHP程序設計有所幫助。

您可能感興趣的文章:
  • 從零開始學YII2框架(六)高級應用程序模板
  • yii2高級應用之自定義組件實現(xiàn)全局使用圖片上傳功能的方法
  • YII Framework框架使用YIIC快速創(chuàng)建YII應用之migrate用法實例詳解
  • YII Framework框架教程之使用YIIC快速創(chuàng)建YII應用詳解
  • Yii2框架redis基本應用示例
  • Yii框架學習筆記之應用組件操作示例
  • Yii框架常見緩存應用實例小結
  • 再談Yii Framework框架中的事件event原理與應用
  • Yii框架應用組件用法實例分析
  • Yii 框架應用(Applications)操作實例詳解

標簽:南通 武漢 平頂山 黃山 唐山 河南 通遼 隴南

巨人網(wǎng)絡通訊聲明:本文標題《Yii Framework框架中事件和行為的區(qū)別及應用實例分析》,本文關鍵詞  Yii,Framework,框架,中,事件,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Yii Framework框架中事件和行為的區(qū)別及應用實例分析》相關的同類信息!
  • 本頁收集關于Yii Framework框架中事件和行為的區(qū)別及應用實例分析的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    91精品婷婷国产综合久久竹菊| 日韩**一区毛片| 91官网在线免费观看| 久久精品av麻豆的观看方式| 欧美成人女星排行榜| www.欧美亚洲| 蜜臀av一区二区在线免费观看 | 波多野结衣一区二区三区 | 综合色中文字幕| 日韩视频免费观看高清完整版在线观看| 国内外成人在线视频| 亚洲女人的天堂| 欧美激情一区二区三区四区| 欧美三级韩国三级日本三斤 | 在线观看欧美日本| 国产成人综合亚洲网站| 麻豆精品在线播放| 婷婷久久综合九色综合伊人色| 国产精品丝袜久久久久久app| 日韩视频免费直播| 51精品国自产在线| 69堂精品视频| 欧美精品v国产精品v日韩精品| 色婷婷久久久亚洲一区二区三区| 国产不卡在线一区| 国产成人综合自拍| 成人网在线播放| 99精品视频中文字幕| 不卡电影免费在线播放一区| 盗摄精品av一区二区三区| 国产在线精品国自产拍免费| 看电视剧不卡顿的网站| 日韩精品电影在线观看| 久久国产生活片100| 91香蕉视频在线| 欧美在线三级电影| 欧美一区二区三区男人的天堂| 欧美日韩不卡视频| 欧美一区二区三区日韩| 精品国产露脸精彩对白| 久久久久久久久久电影| 亚洲人吸女人奶水| 午夜激情久久久| 国产一区二区三区四区在线观看| 国产成人午夜视频| 日本丰满少妇一区二区三区| 91精品国产欧美一区二区18 | 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 午夜精品久久久久久久久久 | 美女网站视频久久| 一区二区视频在线| 免费观看一级特黄欧美大片| 国产.欧美.日韩| 日本韩国视频一区二区| 精品美女一区二区三区| 最新日韩在线视频| 经典三级在线一区| 欧美专区在线观看一区| 国产精品天美传媒沈樵| 卡一卡二国产精品| 国产精品丝袜黑色高跟| 亚洲国产精品影院| 97久久久精品综合88久久| 日韩欧美国产一二三区| 一级做a爱片久久| 国产99精品国产| 久久青草欧美一区二区三区| 五月天一区二区三区| 99久久久国产精品免费蜜臀| 欧美大片在线观看一区| 日韩黄色免费电影| 欧美日韩极品在线观看一区| 亚洲精品国久久99热| 国产成人精品亚洲777人妖 | 亚洲高清免费一级二级三级| 99久久久国产精品| 国产精品国产三级国产普通话蜜臀| 蜜臀久久99精品久久久画质超高清| 色综合网色综合| 亚洲国产成人av网| 欧美精品九九99久久| 免费在线成人网| 日韩精品一区在线观看| 青草av.久久免费一区| 欧美一区二区三区婷婷月色| 午夜精品久久久| 欧美大片在线观看| 国产高清成人在线| 国产精品天干天干在观线| 91老师国产黑色丝袜在线| 亚洲h动漫在线| 久久亚洲捆绑美女| 99久久久久久99| 美腿丝袜亚洲三区| 国产精品少妇自拍| 制服丝袜成人动漫| 99国产精品一区| 日本va欧美va精品发布| 中文字幕欧美三区| 伊人性伊人情综合网| 欧美日韩视频在线观看一区二区三区| 日韩和的一区二区| 国产精品视频一二三区| 欧美日本一区二区在线观看| 国产成人午夜视频| 亚洲va欧美va天堂v国产综合| 久久一日本道色综合| 欧美日韩一区中文字幕| 成人免费av资源| 久久爱另类一区二区小说| 一卡二卡欧美日韩| 一区在线播放视频| 久久综合九色欧美综合狠狠 | 久久久久久久免费视频了| 色婷婷综合久久久久中文一区二区 | 亚洲精品乱码久久久久久日本蜜臀| 欧美一区二区黄| 日本高清无吗v一区| 成人免费精品视频| 成人午夜电影久久影院| 国内精品在线播放| 久久99精品久久久| 久久av老司机精品网站导航| 日韩高清一区在线| 日韩成人一级大片| 婷婷成人激情在线网| 日韩高清在线观看| 日韩黄色在线观看| 老司机免费视频一区二区三区| 美女视频黄免费的久久 | 日韩一区二区在线观看| 911精品国产一区二区在线| 88在线观看91蜜桃国自产| 欧美喷水一区二区| 日韩欧美国产wwwww| 精品国产一区久久| 久久先锋影音av鲁色资源网| 国产日韩欧美高清在线| 亚洲同性同志一二三专区| 一区二区在线观看视频| 亚洲国产美女搞黄色| 六月婷婷色综合| 成人av影视在线观看| 在线精品视频免费观看| 日韩女优电影在线观看| 国产亚洲成av人在线观看导航| 国产精品久久综合| 成人app软件下载大全免费| 91在线视频免费91| 欧美一区二区在线免费观看| 久久久久久免费毛片精品| 亚洲欧美日本在线| 美女视频网站黄色亚洲| 成年人午夜久久久| 欧美一区二区视频免费观看| 国产欧美日韩亚州综合| 五月激情六月综合| 成人精品国产一区二区4080| 欧美一级高清大全免费观看| 欧美国产欧美综合| 蜜臀av一区二区在线观看| 欧美性受xxxx黑人xyx性爽| 国产日韩欧美精品一区| 久久精品99国产精品| 欧美日韩中文字幕一区二区| 国产精品嫩草久久久久| 精品一区二区精品| 日韩欧美电影在线| 亚洲一区二区成人在线观看| 99综合电影在线视频| 国产亚洲美州欧州综合国| 久久91精品国产91久久小草| 51精品国自产在线| 蜜臀av性久久久久蜜臀aⅴ流畅| 一本久久a久久免费精品不卡| 国产精品无遮挡| 成人综合在线视频| 国产精品国产三级国产普通话三级| 国产一区二区三区免费播放 | 久久国产日韩欧美精品| 欧美zozozo| 久久国产精品99久久人人澡| 国产成人精品亚洲日本在线桃色| 欧美绝品在线观看成人午夜影视| 久久久一区二区三区| 精一区二区三区| 国产日产欧美一区二区视频| 韩国理伦片一区二区三区在线播放 | 麻豆极品一区二区三区| 国产一区二区三区视频在线播放| 中文av一区特黄| 欧美tk丨vk视频| 在线亚洲一区二区| 大白屁股一区二区视频| 视频一区欧美精品| 夜夜嗨av一区二区三区四季av| 久久久国产精品麻豆| 日韩欧美国产不卡| 日韩午夜激情视频| 欧美一区二区三级|