亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發(fā) > PHP > 正文

深入解析PHP的Yii框架中的event事件機(jī)制

2024-05-04 23:44:04
字體:
供稿:網(wǎng)友
這篇文章主要介紹了PHP的Yii框架中的event事件機(jī)制,文中講解了Yii的事件處理器以及給組件對象綁定事件處理函數(shù)等重要知識(shí),需要的朋友可以參考下
 

事件
事件可以將自定義代碼“注入”到現(xiàn)有代碼中的特定執(zhí)行點(diǎn)。附加自定義代碼到某個(gè)事件,當(dāng)這個(gè)事件被觸發(fā)時(shí),這些代碼就會(huì)自動(dòng)執(zhí)行。例如,郵件程序?qū)ο蟪晒Πl(fā)出消息時(shí)可觸發(fā) messageSent 事件。如想追蹤成功發(fā)送的消息,可以附加相應(yīng)追蹤代碼到messageSent 事件。
Yii 引入了名為 yii/base/Component 的基類以支持事件。如果一個(gè)類需要觸發(fā)事件就應(yīng)該繼承 yii/base/Component 或其子類。

Yii的event機(jī)制
YII的事件機(jī)制,是其比較獨(dú)特之處,合理使用好事件機(jī)制,會(huì)使各個(gè)組件之間的耦合更為松散,利于團(tuán)體協(xié)作開發(fā)。
何時(shí)需要使用事件,如何給事件綁定事件處理函數(shù),以及如何觸發(fā)事件,與其它語言是有較大的差別的。例如Javascript中,可以使用

$(‘#id').on("click",function() {});

方式給DOM元素綁定處理函數(shù),當(dāng)DOM元素上發(fā)生指定的事件(如click)時(shí),將自動(dòng)執(zhí)行設(shè)定的函數(shù)。 
但是PHP是服務(wù)器端的腳本語言,就不存在自動(dòng)觸發(fā)事件之說,所以和Javascript對比,YII中的事件是需要手動(dòng)觸發(fā)的。一般來說,要實(shí)現(xiàn)YII組件的事件機(jī)制,需要以下幾步:

定義事件名稱,其實(shí)就是級(jí)組件定義一個(gè)on開頭的方法,其中的代碼是固定的,如:

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

即函數(shù)名與事件名是一致的。此步的作用就是將綁定在此事件上的處理函數(shù)逐個(gè)執(zhí)行。寫這一系列的播客,算是一個(gè)整理,所以我寫細(xì)一點(diǎn),現(xiàn)在把raiseEvent方法的代碼貼出來。

/** * Raises an event.   * This method represents the happening of an event. It invokes   * all attached handlers for the event.   * @param string $name the event name   * @param CEvent $event the event parameter   * @throws CException if the event is undefined or an event handler is invalid. */  public function raiseEvent($name,$event){         $name=strtolower($name);         //_e這個(gè)數(shù)組用來存所有事件信息       if(isset($this->_e[$name]))  {             foreach($this->_e[$name] as $handler) {                 if(is_string($handler))               call_user_func($handler,$event);                   elseif(is_callable($handler,true)){                  if(is_array($handler)){                           // an array: 0 - object, 1 - method name                     list($object,$method)=$handler;                      if(is_string($object)) // static method call                     call_user_func($handler,$event);                    elseif(method_exists($object,$method))                          $object->$method($event);                           else                              throw new CException(Yii::t('yii','Event "{class}.{event}" is attached with an invalid handler "{handler}".',  array('{class}'=>get_class($this), '{event}'=>$name, '{handler}'=>$handler[1])));                        }                        else // PHP 5.3: anonymous function                      call_user_func($handler,$event);                 }                 else                    throw new CException(Yii::t('yii','Event "{class}.{event}" is attached with an invalid handler "{handler}".', array('{class}'=>get_class($this), '{event}'=>$name, '{handler}'=>gettype($handler))));                // stop further handling if param.handled is set true             if(($event instanceof CEvent) && $event->handled)               return;             }         }  elseif(YII_DEBUG && !$this->hasEvent($name))             throw new CException(Yii::t('yii','Event "{class}.{event}" is not defined.',     array('{class}'=>get_class($this), '{event}'=>$name))); }

事件處理器(Event Handlers)

事件處理器是一個(gè)PHP 回調(diào)函數(shù),當(dāng)它所附加到的事件被觸發(fā)時(shí)它就會(huì)執(zhí)行??梢允褂靡韵禄卣{(diào)函數(shù)之一:

  • 字符串形式指定的 PHP 全局函數(shù),如 'trim' ;
  • 對象名和方法名數(shù)組形式指定的對象方法,如 [$object, $method] ;
  • 類名和方法名數(shù)組形式指定的靜態(tài)類方法,如 [$class, $method] ;
  • 匿名函數(shù),如 function ($event) { ... } 。

事件處理器的格式是:

function ($event) {  // $event 是 yii/base/Event 或其子類的對象}

通過 $event 參數(shù),事件處理器就獲得了以下有關(guān)事件的信息:

  • yii/base/Event::name:事件名
  • yii/base/Event::sender:調(diào)用 trigger() 方法的對象
  • yii/base/Event::data:附加事件處理器時(shí)傳入的數(shù)據(jù),默認(rèn)為空,后文詳述

附加事件處理器

調(diào)用 yii/base/Component::on() 方法來附加處理器到事件上。如:

$foo = new Foo;// 處理器是全局函數(shù)$foo->on(Foo::EVENT_HELLO, 'function_name');// 處理器是對象方法$foo->on(Foo::EVENT_HELLO, [$object, 'methodName']);// 處理器是靜態(tài)類方法$foo->on(Foo::EVENT_HELLO, ['app/components/Bar', 'methodName']);// 處理器是匿名函數(shù)$foo->on(Foo::EVENT_HELLO, function ($event) {  //事件處理邏輯});附加事件處理器時(shí)可以提供額外數(shù)據(jù)作為 yii/base/Component::on() 方法的第三個(gè)參數(shù)。數(shù)據(jù)在事件被觸發(fā)和處理器被調(diào)用時(shí)能被處理器使用。如:// 當(dāng)事件被觸發(fā)時(shí)以下代碼顯示 "abc"// 因?yàn)?$event->data 包括被傳遞到 "on" 方法的數(shù)據(jù)$foo->on(Foo::EVENT_HELLO, function ($event) {  echo $event->data;}, 'abc');

事件處理器順序

可以附加一個(gè)或多個(gè)處理器到一個(gè)事件。當(dāng)事件被觸發(fā),已附加的處理器將按附加次序依次調(diào)用。如果某個(gè)處理器需要停止其后的處理器調(diào)用,可以設(shè)置 $event 參數(shù)的 [yii/base/Event::handled]] 屬性為真,如下:

$foo->on(Foo::EVENT_HELLO, function ($event) {  $event->handled = true;});

默認(rèn)新附加的事件處理器排在已存在處理器隊(duì)列的最后。因此,這個(gè)處理器將在事件被觸發(fā)時(shí)最后一個(gè)調(diào)用。在處理器隊(duì)列最前面插入新處理器將使該處理器最先調(diào)用,可以傳遞第四個(gè)參數(shù) $append 為假并調(diào)用 yii/base/Component::on() 方法實(shí)現(xiàn):

$foo->on(Foo::EVENT_HELLO, function ($event) {  // 這個(gè)處理器將被插入到處理器隊(duì)列的第一位...}, $data, false);


觸發(fā)事件

事件通過調(diào)用 yii/base/Component::trigger() 方法觸發(fā),此方法須傳遞事件名,還可以傳遞一個(gè)事件對象,用來傳遞參數(shù)到事件處理器。如:

namespace app/components;use yii/base/Component;use yii/base/Event;class Foo extends Component{  const EVENT_HELLO = 'hello';  public function bar()  {    $this->trigger(self::EVENT_HELLO);  }}

以上代碼當(dāng)調(diào)用 bar() ,它將觸發(fā)名為 hello 的事件。

提示:推薦使用類常量來表示事件名。上例中,常量 EVENT_HELLO 用來表示 hello 。這有兩個(gè)好處。第一,它可以防止拼寫錯(cuò)誤并支持 IDE 的自動(dòng)完成。第二,只要簡單檢查常量聲明就能了解一個(gè)類支持哪些事件。
有時(shí)想要在觸發(fā)事件時(shí)同時(shí)傳遞一些額外信息到事件處理器。例如,郵件程序要傳遞消息信息到 messageSent 事件的處理器以便處理器了解哪些消息被發(fā)送了。為此,可以提供一個(gè)事件對象作為 yii/base/Component::trigger() 方法的第二個(gè)參數(shù)。這個(gè)事件對象必須是 yii/base/Event 類或其子類的實(shí)例。如:

namespace app/components;use yii/base/Component;use yii/base/Event;class MessageEvent extends Event{  public $message;}class Mailer extends Component{  const EVENT_MESSAGE_SENT = 'messageSent';  public function send($message)  {    // ...發(fā)送 $message 的邏輯...    $event = new MessageEvent;    $event->message = $message;    $this->trigger(self::EVENT_MESSAGE_SENT, $event);  }}

當(dāng) yii/base/Component::trigger() 方法被調(diào)用時(shí),它將調(diào)用所有附加到命名事件(trigger 方法第一個(gè)參數(shù))的事件處理器。

移除事件處理器

從事件移除處理器,調(diào)用 yii/base/Component::off() 方法。如:

// 處理器是全局函數(shù)$foo->off(Foo::EVENT_HELLO, 'function_name');// 處理器是對象方法$foo->off(Foo::EVENT_HELLO, [$object, 'methodName']);// 處理器是靜態(tài)類方法$foo->off(Foo::EVENT_HELLO, ['app/components/Bar', 'methodName']);// 處理器是匿名函數(shù)$foo->off(Foo::EVENT_HELLO, $anonymousFunction);

注意當(dāng)匿名函數(shù)附加到事件后一般不要嘗試移除匿名函數(shù),除非你在某處存儲(chǔ)了它。以上示例中,假設(shè)匿名函數(shù)存儲(chǔ)為變量$anonymousFunction 。

移除事件的全部處理器,簡單調(diào)用 yii/base/Component::off() 即可,不需要第二個(gè)參數(shù):

$foo->off(Foo::EVENT_HELLO);

類級(jí)別的事件處理器

以上部分,我們敘述了在實(shí)例級(jí)別如何附加處理器到事件。有時(shí)想要一個(gè)類的所有實(shí)例而不是一個(gè)指定的實(shí)例都響應(yīng)一個(gè)被觸發(fā)的事件,并不是一個(gè)個(gè)附加事件處理器到每個(gè)實(shí)例,而是通過調(diào)用靜態(tài)方法 yii/base/Event::on() 在類級(jí)別附加處理器。

例如,活動(dòng)記錄對象要在每次往數(shù)據(jù)庫新增一條新記錄時(shí)觸發(fā)一個(gè) yii/db/BaseActiveRecord::EVENT_AFTER_INSERT 事件。要追蹤每個(gè)活動(dòng)記錄對象的新增記錄完成情況,應(yīng)如下寫代碼:

use Yii;use yii/base/Event;use yii/db/ActiveRecord;Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_INSERT, function ($event) {  Yii::trace(get_class($event->sender) . ' is inserted');});

每當(dāng) yii/db/BaseActiveRecord 或其子類的實(shí)例觸發(fā) yii/db/BaseActiveRecord::EVENT_AFTER_INSERT 事件時(shí),這個(gè)事件處理器都會(huì)執(zhí)行。在這個(gè)處理器中,可以通過 $event->sender 獲取觸發(fā)事件的對象。

當(dāng)對象觸發(fā)事件時(shí),它首先調(diào)用實(shí)例級(jí)別的處理器,然后才會(huì)調(diào)用類級(jí)別處理器。

可調(diào)用靜態(tài)方法yii/base/Event::trigger()來觸發(fā)一個(gè)類級(jí)別事件。類級(jí)別事件不與特定對象相關(guān)聯(lián)。因此,它只會(huì)引起類級(jí)別事件處理器的調(diào)用。如:

use yii/base/Event;Event::on(Foo::className(), Foo::EVENT_HELLO, function ($event) {  echo $event->sender; // 顯示 "app/models/Foo"});Event::trigger(Foo::className(), Foo::EVENT_HELLO);

注意這種情況下 $event->sender 指向觸發(fā)事件的類名而不是對象實(shí)例。

注意:因?yàn)轭惣?jí)別的處理器響應(yīng)類和其子類的所有實(shí)例觸發(fā)的事件,必須謹(jǐn)慎使用,尤其是底層的基類,如 yii/base/Object。
移除類級(jí)別的事件處理器只需調(diào)用yii/base/Event::off(),如:

// 移除 $handlerEvent::off(Foo::className(), Foo::EVENT_HELLO, $handler);// 移除 Foo::EVENT_HELLO 事件的全部處理器Event::off(Foo::className(), Foo::EVENT_HELLO);

全局事件

所謂全局事件實(shí)際上是一個(gè)基于以上敘述的事件機(jī)制的戲法。它需要一個(gè)全局可訪問的單例,如應(yīng)用實(shí)例。

事件觸發(fā)者不調(diào)用其自身的 trigger() 方法,而是調(diào)用單例的 trigger() 方法來觸發(fā)全局事件。類似地,事件處理器被附加到單例的事件。如:

use Yii;use yii/base/Event;use app/components/Foo;Yii::$app->on('bar', function ($event) {  echo get_class($event->sender); // 顯示 "app/components/Foo"});Yii::$app->trigger('bar', new Event(['sender' => new Foo]));

全局事件的一個(gè)好處是當(dāng)附加處理器到一個(gè)對象要觸發(fā)的事件時(shí),不需要產(chǎn)生該對象。相反,處理器附加和事件觸發(fā)都通過單例(如應(yīng)用實(shí)例)完成。

然而,因?yàn)槿质录拿臻g由各方共享,應(yīng)合理命名全局事件,如引入一些命名空間(例:"frontend.mail.sent", "backend.mail.sent")。

給組件對象綁定事件處理函數(shù)

$component->attachEventHandler($name, $handler);$component->onBeginRequest = $handler ;

yii支持一個(gè)事件綁定多個(gè)回調(diào)函數(shù),上述的兩個(gè)方法都會(huì)在已有的事件上增加新的回調(diào)函數(shù),而不會(huì)覆蓋已有回調(diào)函數(shù)。
$handler即是一個(gè)PHP回調(diào)函數(shù),關(guān)于回調(diào)函數(shù)的形式,本文的最后會(huì)附帶說明。如CLogRouter組件的init事件中,有以下代碼:

Yii::app()->attachEventHandler('onEndRequest',array($this,'processLogs'));

這就是給CApplication對象的onEndRequest綁定了CLogRouter::processLogs()回調(diào)函數(shù)。而CApplication組件確實(shí)存在名為onEndRequest的方法(即onEndRequest事件),它之中的代碼就是激活了相應(yīng)的回調(diào)函數(shù),即CLogRouter::processLogs()方法。所以從這里可以得出,日志的記錄其實(shí)是發(fā)生在CApplication組件的正常退出時(shí)。

在需要觸發(fā)事件的時(shí)候,直接激活組件的事件,即調(diào)用事件即可,如:比如CApplication組件的run方法中:

if($this->hasEventHandler('onBeginRequest'))  $this->onBeginRequest(new CEvent($this));

這樣即觸發(fā)了事件處理函數(shù)。如果沒有第一行的判斷,那么在調(diào)試模式下(YII_DEBUG常量被定義為true),會(huì)拋出異常,而在非調(diào)試模式下(YII_DEBUG常量定義為false或沒有定義YII_DEBUG常量),則不會(huì)產(chǎn)生任何異常。
回調(diào)函數(shù)的形式:

普通全局函數(shù)(內(nèi)置的或用戶自定義的)

call_user_func(‘print', $str);

類的靜態(tài)方法,使用數(shù)組形式傳遞

call_user_func(array(‘className', ‘print'), $str );

對象方法,使用數(shù)組形式傳遞

$obj = new className();call_user_func(array($obj, ‘print'), $str );

匿名方法,類似javascript的匿名函數(shù)

call_user_func(function($i){echo $i++;},4);

或使用以下形式:

$s = function($i) {  echo $i++;};call_user_func($s,4);

總結(jié)

關(guān)于Yii的事件機(jī)制其實(shí)就是提供了一種用于解耦的方式,在需要調(diào)用event的地方之前,只要你提供了事件的實(shí)現(xiàn)并注冊在之后的地方需要的時(shí)候即可調(diào)用。



發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
91丨九色丨国产在线| 久久激情电影| 粉嫩一区二区三区国产精品| 九色在线观看| 日本不卡一区二区三区| 蜜桃传媒麻豆第一区在线观看| 亚洲色婷婷久久精品av蜜桃| 亚洲日本va午夜在线影院| 亚洲性猛交富婆| 午夜成人在线视频| 久久久久久av无码免费网站| 亚洲一区二区三区无码久久| 欧美乱大交xxxxx在线观看| 精品无人区乱码1区2区3区在线| 欧美日韩激情在线一区二区三区| 久草免费在线色站| 94色蜜桃网一区二区三区| 日本成人黄色片| 国产成a人亚洲精v品在线观看| 国产一区电影| 国产精品污www一区二区三区| 电影一区二区在线观看| 成人97人人超碰人人99| 欧美做受高潮电影o| 亚洲一区二区福利视频| 欧美日韩久久中文字幕| 毛片网站在线| 国产精品伦一区二区三区视频| 国产亚洲精品一区二555| 欧美大片免费观看| 性感美女福利视频| 日韩精品手机在线观看| 中文字幕在线观看第一页| 亚洲午夜精品视频| 国产国语性生话播放| 在线观看日本www| 国产麻豆一区二区三区| 少妇一区二区三区| 欧美色综合网| 精品视频在线免费| 巨乳女教师的诱惑| 亚洲欧美一区二区三区久久| 午夜视频在线观看韩国| 国产电影一区二区在线观看| 在线不卡欧美| 国产毛片av在线| 大片免费播放在线视频| 日韩高清一级片| 日本欧美一区二区三区| 久久国产精品72免费观看| 女生裸体免费视频| 岛国电影中文在线| 美女胸又www又黄的网站| 亚洲精品自产拍在线观看app| 日韩美女免费线视频| 免费vip影院| www.视频在线.com| 中文字幕一区二区三区四区不卡| 米仓穗香在线观看| 日韩在线不卡一区| 亚洲一区二区三区欧美| 超碰97网站| 国产1区在线观看| 亚洲影视中文字幕| 日韩色级片先锋影音| 外国成人免费视频| 最近中文字幕免费mv2018在线| 成人影院在线播放| 91sp网站在线观看入口| 国产精品麻豆| 啦啦啦高清在线观看www| 2022国产精品| 亚洲欧洲日产国码无码久久99| av免费在线观看网址| 亚洲激情 欧美| 久久aⅴ国产欧美74aaa| 欧美午夜a级限制福利片| 日韩av网址在线| 久久人人97超碰精品888| 欧美在线观看禁18| 午夜一级毛片| 黄色网页大全| 日本一区二区免费高清视频| 影音先锋制服丝袜| 日本不卡免费播放| 国产美女永久免费| 男人操女人的视频在线观看欧美| 最新久久zyz资源站| 欧美日韩一区视频| 制服丝袜中文字幕亚洲| 真实的国产乱xxxx在线91| 日韩精品久久久久久久软件91| 蜜桃av一区| 成年人av网站| 日韩一区二区在线视频| 国产精品色呦呦| 日韩无码精品一区二区| 国产成a人亚洲精品| 成人在线视频免费观看| 激情视频一区二区三区| 成人午夜视频一区二区播放| 999热视频在线观看| 久久资源av| 亚洲а∨天堂久久精品喷水| 国产精品av免费观看| 任你操视频在线观看| 精品国产一区二区三区忘忧草| 日韩小视频在线播放| 国产欧美欧洲在线观看| 中文字幕精品在线不卡| 91九色老女人| 日韩电影中文 亚洲精品乱码| 欧美成人精品一区二区三区| 久久久久久一区| 6080yy精品一区二区三区| 青青草一区二区| 免费在线观看h片| 黄色动漫在线免费观看| 久久全国免费久久青青小草| 久久日文中文字幕乱码| 色综合导航网站| 欧美国产精品va在线观看| 乱老熟女一区二区三区| 91色乱码一区二区三区| 亚洲精选在线视频| 日韩欧美在线中字| 亚洲一区精品视频| 欧美性猛交xxxxxxxx| www.av蜜桃| 中文字幕黄色大片| 九九精品九九| 国产肉体xxxx裸体784大胆| 欧美一卡2卡三卡4卡5免费| 成人福利视频在线观看| 亚洲欧美色视频| 午夜欧美巨大性欧美巨大| 91精品久久久久久蜜桃| 免费在线观看一级片| 国产剧情一区二区| 亚洲在线精品视频| 另类专区欧美| 午夜免费一级片| 国产69精品久久久久9999apgf| 日本成人黄色| 国产精品大尺度| 欧美性猛交xxxxx免费看| 精品国产一级毛片| 成人天堂av| 久久国产精品区| 国产精品一香蕉国产线看观看| 伊人久久大香线蕉精品组织观看| 亚洲人a成www在线影院| 99在线热播精品免费99热| 国模精品系列视频| www.四虎.com| 国产色一区二区三区| 日本不卡免费高清视频在线| 免费a级片在线观看| 国产伦精品一区二区三区视频痴汉| 99国产精品白浆在线观看免费| 国产成人涩涩涩视频在线观看| 国产调教一区二区三区| 成年人在线免费| 亚洲av成人无码一二三在线观看| 国产黄色大片网站| 1024亚洲合集| 成人福利网站在线观看11| 自拍日韩亚洲一区在线| 日本韩国一区二区| 日本毛片在线观看| 精品视频一区二区三区四区五区| 午夜国产福利一区二区| 少妇熟女视频一区二区三区| 欧美精品在线网站| 免费日韩精品中文字幕视频在线| 国产精品激情av在线播放| 欧美日韩国产欧美日美国产精品| 色综合一个色综合| 国产95在线|亚洲| 偷拍女澡堂一区二区三区| 亚洲免费观看高清完整版在线| 久久人人妻人人人人妻性色av| 26uuu国产电影一区二区| 日本wwww色| 视频一区日韩精品| 久久一区二区三区国产精品| 91久久爱成人| 国产福利第一视频在线播放| 久热精品免费视频| 动漫美女无遮挡免费| 精品人妻午夜一区二区三区四区| 欧美区在线播放| 欧美图片欧美激情欧美精品| 91久久在线播放| 久久中文字幕无码| 韩国三级在线观看久| 国产精品色在线| 欧美日韩精品一区二区视频| 国产男男gay网站| 美女航空一级毛片在线播放| 免费又黄又爽又色的视频| 亚洲xxxxxx| 日韩一区二区三区视频在线观看| 91成人福利在线| 欧美另类69xxxxx| 黄色成人在线视频| 欧美爱爱视频网站| 色一区在线观看| 国模吧视频一区| 中文字幕一二三| 日韩欧美亚洲另类制服综合在线| 国产欧美一区二区三区视频在线观看| 免费看国产曰批40分钟| 国产欧美日韩亚洲| www.国产欧美| 欧美日韩亚洲视频| 日韩三级一区| 久久成人精品无人区| 日韩精品一二三四区| 天堂va蜜桃一区二区三区漫画版| 亚洲国产精品国自产拍av秋霞| 国内自拍视频在线看免费观看| 福利视频电影| 亚洲精品在线免费观看视频| 最近中文字幕免费在线观看| 日韩三级成人av网| 国产精品久久久久久| 亚洲欧洲精品一区二区三区| 成人av色网站| 亚洲人成电影网站色www| 国产精品福利av| av电影免费在线看| 日韩成人av免费| 最新国产の精品合集bt伙计| 国产精品白丝jk喷水视频一区| 欧美中文字幕视频在线观看| 久久精品一本久久99精品| 久久亚洲私人国产精品va| 中文精品视频一区二区在线观看| 久久久精品黄色| 日韩欧美一区二区三区| 91九色视频在线| 90岁老太婆乱淫| 影音先锋国产在线资源| 久久精品一级| 欧美黄色免费影院| 国产免费成人av| 国产黄色影视| 好看的日韩精品| 国产精品正在播放| 国产伦精品一区二区三区免| 青青草原国产免费| 久久久久国产一区| 伦理片一区二区三区| 精品在线观看一区| 欧美男男激情freegay| 操操操综合网| 777777国产7777777| 一本色道久久加勒比精品| 精品久久久久久久久久久久久久久久久| 激情欧美日韩一区二区| 樱花草国产18久久久久| 黄在线免费观看| 熟女熟妇伦久久影院毛片一区二区| 激情视频综合网| 久草免费在线观看| 欧美日韩国产观看视频| 特级西西人体高清大胆| 亚洲高清在线免费观看| 国产91精品在线播放| 好吊妞国产欧美日韩免费观看网站| 日韩精品视频网站| 欧美精品aⅴ在线视频| 波多野结衣喷潮| 一区二区三区不卡视频在线观看| 操人真爽免费视频| 天堂网www在线观看| 日韩av电影免费观看高清| 精品人伦一区二区色婷婷| 韩国三级hd中文字幕有哪些| 伊人国产在线看一| 日韩电影在线免费| 国产精品久久久久永久免费观看| 国内视频一区二区| 欧美日韩国产精品一区| 欧洲一级视频| 国产精品美女久久久久av爽| 日韩中文字幕在线看| 亚洲高清123| 99精品热视频只有精品10| 成人精品一区二区三区免费| 日本高清中文字幕二区在线| 无码黑人精品一区二区| 国精产品一区一区三区四川| 欧美白人猛性xxxxx交69| 精品视频在线播放免| 欧美日韩性在线观看| 97婷婷大伊香蕉精品视频| 色综合久久久久久久久五月| 精品人妻少妇嫩草av无码| 亚洲电影成人成人影院| 免费看特级毛片| 麻豆一区二区三区精品视频| av最新在线观看| 久久亚洲一区二区三区明星换脸| 欧美精品一卡两卡| 色琪琪综合男人的天堂aⅴ视频| 欧美日韩精品二区第二页| 国产精品一二区| 亚洲大型综合色站| 欧美日韩亚洲第一| 久久久久99精品国产片| 亚洲欧美成人综合| 国产一区二区三区在线观看视频| 97人人模人人爽人人澡| 91性高湖久久久久久久久_久久99| zzijzzij亚洲日本成熟少妇| 国产成人精品网站| 色哟哟一区二区三区| 日本小视频在线免费观看| 国产精品入口麻豆完整版| 日韩不卡高清| 香港三级日本三级| 国产福利精品在线| 婷婷五月色综合香五月| 亚洲国产日韩a在线播放| 久久爱www成人| 久久综合国产精品|