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

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

Zend Framework教程之動作的基類Zend_Controller_Action詳解

2024-05-04 23:43:40
字體:
供稿:網(wǎng)友
這篇文章主要介紹了Zend Framework教程之動作的基類Zend_Controller_Action的用法,結(jié)合實例形式詳細(xì)分析了動作的基類Zend_Controller_Action具體功能,使用方法與相關(guān)注意事項,需要的朋友可以參考下
 

本文實例講述了Zend Framework教程之動作的基類Zend_Controller_Action。分享給大家供大家參考,具體如下:

Zend_Controller_Action的實現(xiàn)

Zend Framework的動作控制器需要繼承Zend_Controller_Action,Zend_Controller_Action提供了動作控制器的基本功能,具體參考如下代碼:

Zend_Controller_Action_Interface

<?phpinterface Zend_Controller_Action_Interface{  /**   * Class constructor   *   * The request and response objects should be registered with the   * controller, as should be any additional optional arguments; these will be   * available via {@link getRequest()}, {@link getResponse()}, and   * {@link getInvokeArgs()}, respectively.   *   * When overriding the constructor, please consider this usage as a best   * practice and ensure that each is registered appropriately; the easiest   * way to do so is to simply call parent::__construct($request, $response,   * $invokeArgs).   *   * After the request, response, and invokeArgs are set, the   * {@link $_helper helper broker} is initialized.   *   * Finally, {@link init()} is called as the final action of   * instantiation, and may be safely overridden to perform initialization   * tasks; as a general rule, override {@link init()} instead of the   * constructor to customize an action controller's instantiation.   *   * @param Zend_Controller_Request_Abstract $request   * @param Zend_Controller_Response_Abstract $response   * @param array $invokeArgs Any additional invocation arguments   * @return void   */  public function __construct(Zend_Controller_Request_Abstract $request,                Zend_Controller_Response_Abstract $response,                array $invokeArgs = array());  /**   * Dispatch the requested action   *   * @param string $action Method name of action   * @return void   */  public function dispatch($action);}

Zend_Controller_Action

<?phprequire_once 'Zend/Controller/Action/HelperBroker.php';require_once 'Zend/Controller/Action/Interface.php';require_once 'Zend/Controller/Front.php';abstract class Zend_Controller_Action implements Zend_Controller_Action_Interface{  protected $_classMethods;  protected $_delimiters;  protected $_invokeArgs = array();  protected $_frontController;  protected $_request = null;  protected $_response = null;  public $viewSuffix = 'phtml';  public $view;  protected $_helper = null;  public function __construct(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response, array $invokeArgs = array())  {    $this->setRequest($request)       ->setResponse($response)       ->_setInvokeArgs($invokeArgs);    $this->_helper = new Zend_Controller_Action_HelperBroker($this);    $this->init();  }  public function init()  {  }  public function initView()  {    if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) {      return $this->view;    }    require_once 'Zend/View/Interface.php';    if (isset($this->view) && ($this->view instanceof Zend_View_Interface)) {      return $this->view;    }    $request = $this->getRequest();    $module = $request->getModuleName();    $dirs  = $this->getFrontController()->getControllerDirectory();    if (empty($module) || !isset($dirs[$module])) {      $module = $this->getFrontController()->getDispatcher()->getDefaultModule();    }    $baseDir = dirname($dirs[$module]) . DIRECTORY_SEPARATOR . 'views';    if (!file_exists($baseDir) || !is_dir($baseDir)) {      require_once 'Zend/Controller/Exception.php';      throw new Zend_Controller_Exception('Missing base view directory ("' . $baseDir . '")');    }    require_once 'Zend/View.php';    $this->view = new Zend_View(array('basePath' => $baseDir));    return $this->view;  }  public function render($action = null, $name = null, $noController = false)  {    if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) {      return $this->_helper->viewRenderer->render($action, $name, $noController);    }    $view  = $this->initView();    $script = $this->getViewScript($action, $noController);    $this->getResponse()->appendBody(      $view->render($script),      $name    );  }  public function renderScript($script, $name = null)  {    if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) {      return $this->_helper->viewRenderer->renderScript($script, $name);    }    $view = $this->initView();    $this->getResponse()->appendBody(      $view->render($script),      $name    );  }  public function getViewScript($action = null, $noController = null)  {    if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) {      $viewRenderer = $this->_helper->getHelper('viewRenderer');      if (null !== $noController) {        $viewRenderer->setNoController($noController);      }      return $viewRenderer->getViewScript($action);    }    $request = $this->getRequest();    if (null === $action) {      $action = $request->getActionName();    } elseif (!is_string($action)) {      require_once 'Zend/Controller/Exception.php';      throw new Zend_Controller_Exception('Invalid action specifier for view render');    }    if (null === $this->_delimiters) {      $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher();      $wordDelimiters = $dispatcher->getWordDelimiter();      $pathDelimiters = $dispatcher->getPathDelimiter();      $this->_delimiters = array_unique(array_merge($wordDelimiters, (array) $pathDelimiters));    }    $action = str_replace($this->_delimiters, '-', $action);    $script = $action . '.' . $this->viewSuffix;    if (!$noController) {      $controller = $request->getControllerName();      $controller = str_replace($this->_delimiters, '-', $controller);      $script = $controller . DIRECTORY_SEPARATOR . $script;    }    return $script;  }  public function getRequest()  {    return $this->_request;  }  public function setRequest(Zend_Controller_Request_Abstract $request)  {    $this->_request = $request;    return $this;  }  public function getResponse()  {    return $this->_response;  }  public function setResponse(Zend_Controller_Response_Abstract $response)  {    $this->_response = $response;    return $this;  }  protected function _setInvokeArgs(array $args = array())  {    $this->_invokeArgs = $args;    return $this;  }  public function getInvokeArgs()  {    return $this->_invokeArgs;  }  public function getInvokeArg($key)  {    if (isset($this->_invokeArgs[$key])) {      return $this->_invokeArgs[$key];    }    return null;  }  public function getHelper($helperName)  {    return $this->_helper->{$helperName};  }  public function getHelperCopy($helperName)  {    return clone $this->_helper->{$helperName};  }  public function setFrontController(Zend_Controller_Front $front)  {    $this->_frontController = $front;    return $this;  }  public function getFrontController()  {    // Used cache version if found    if (null !== $this->_frontController) {      return $this->_frontController;    }    // Grab singleton instance, if class has been loaded    if (class_exists('Zend_Controller_Front')) {      $this->_frontController = Zend_Controller_Front::getInstance();      return $this->_frontController;    }    // Throw exception in all other cases    require_once 'Zend/Controller/Exception.php';    throw new Zend_Controller_Exception('Front controller class has not been loaded');  }  public function preDispatch()  {  }  public function postDispatch()  {  }  public function __call($methodName, $args)  {    require_once 'Zend/Controller/Action/Exception.php';    if ('Action' == substr($methodName, -6)) {      $action = substr($methodName, 0, strlen($methodName) - 6);      throw new Zend_Controller_Action_Exception(sprintf('Action "%s" does not exist and was not trapped in __call()', $action), 404);    }    throw new Zend_Controller_Action_Exception(sprintf('Method "%s" does not exist and was not trapped in __call()', $methodName), 500);  }  public function dispatch($action)  {    // Notify helpers of action preDispatch state    $this->_helper->notifyPreDispatch();    $this->preDispatch();    if ($this->getRequest()->isDispatched()) {      if (null === $this->_classMethods) {        $this->_classMethods = get_class_methods($this);      }      // If pre-dispatch hooks introduced a redirect then stop dispatch      // @see ZF-7496      if (!($this->getResponse()->isRedirect())) {        // preDispatch() didn't change the action, so we can continue        if ($this->getInvokeArg('useCaseSensitiveActions') || in_array($action, $this->_classMethods)) {          if ($this->getInvokeArg('useCaseSensitiveActions')) {            trigger_error('Using case sensitive actions without word separators is deprecated; please do not rely on this "feature"');          }          $this->$action();        } else {          $this->__call($action, array());        }      }      $this->postDispatch();    }    // whats actually important here is that this action controller is    // shutting down, regardless of dispatching; notify the helpers of this    // state    $this->_helper->notifyPostDispatch();  }  public function run(Zend_Controller_Request_Abstract $request = null, Zend_Controller_Response_Abstract $response = null)  {    if (null !== $request) {      $this->setRequest($request);    } else {      $request = $this->getRequest();    }    if (null !== $response) {      $this->setResponse($response);    }    $action = $request->getActionName();    if (empty($action)) {      $action = 'index';    }    $action = $action . 'Action';    $request->setDispatched(true);    $this->dispatch($action);    return $this->getResponse();  }  protected function _getParam($paramName, $default = null)  {    $value = $this->getRequest()->getParam($paramName);     if ((null === $value || '' === $value) && (null !== $default)) {      $value = $default;    }    return $value;  }  protected function _setParam($paramName, $value)  {    $this->getRequest()->setParam($paramName, $value);    return $this;  }  protected function _hasParam($paramName)  {    return null !== $this->getRequest()->getParam($paramName);  }  protected function _getAllParams()  {    return $this->getRequest()->getParams();  }  final protected function _forward($action, $controller = null, $module = null, array $params = null)  {    $request = $this->getRequest();    if (null !== $params) {      $request->setParams($params);    }    if (null !== $controller) {      $request->setControllerName($controller);      // Module should only be reset if controller has been specified      if (null !== $module) {        $request->setModuleName($module);      }    }    $request->setActionName($action)        ->setDispatched(false);  }  protected function _redirect($url, array $options = array())  {    $this->_helper->redirector->gotoUrl($url, $options);  }}

Zend_Controller_Action提供了動作和視圖的render功能,以及注冊請求和響應(yīng)對象,常用助手等等。

動作控制器的常用方法

在動作控制器中常用的方法和屬性如下:

$this->_helper主要完成助手的相關(guān)操作例如:

// 只是局部控制器;當(dāng)初始化加載時,對這個控制器的所有動作有效:$this->_helper->viewRenderer->setNoRender(true);// 全局:$this->_helper->removeHelper('viewRenderer'); // 也是全局,但需要和本地版本協(xié)作,以便繁殖這個控制器:Zend_Controller_Front::getInstance()->setParam('noViewRenderer', true);

通過設(shè)置ViewRenderer的noRender標(biāo)記,可以簡單地為一個獨立的視圖禁止解析(rendering):

class FooController extends Zend_Controller_Action{  public function barAction()  {    // disable autorendering for this action only:    $this->_helper->viewRenderer->setNoRender();  }}

禁止ViewRenderer的主要原因是如果你不需要視圖對象或者如果你不通過視圖腳本(例如,當(dāng)使用動作控制器來司服網(wǎng)站服務(wù)協(xié)議如SOAP,XML-RPC或REST)來解析。大多數(shù)情況下,你不需要全局地禁止ViewRenderer,只選擇性地在個別控制器或動作里禁止它。

請求對象和響應(yīng)對象的相關(guān)操作

無數(shù)的對象和變量與對象一起注冊,并且每個都有訪問器方法。

請求對象:getRequest()可用來讀取調(diào)用動作請求對象。

響應(yīng)對象: getResponse()可用來讀取收集最終響應(yīng)的響應(yīng)對象。一些典型的調(diào)用看起來象這樣:

$this->getResponse()->setHeader('Content-Type', 'text/xml');$this->getResponse()->appendBody($content);

調(diào)用參數(shù):前端控制器可能把參數(shù)傳給路由器、派遣器和動作控制器。為了讀取這些參數(shù),可使用getInvokeArg($key);另外,用getInvokeArgs()讀取整個參數(shù)列表。

請求參數(shù):請求對象手機請求參數(shù),如任何_GET 或 _POST 參數(shù),或者指定在URL的路徑信息里的用戶參數(shù)。為了讀取這些參數(shù),可使用_getParam($key)或_getAllParams()。也可以用_setParam()來設(shè)置請求參數(shù);當(dāng)轉(zhuǎn)發(fā)到另外的動作時這很有用。

用_hasParam($key)來測試是否一個參數(shù)存在(對邏輯分支有用)。

Note: _getParam()可帶有一個可選的第二個參數(shù),如果它不是空的,就包含一個缺省的值。用它在讀取值之前來消除對_hasParam() 的調(diào)用:

// Use default value of 1 if id is not set$id = $this->_getParam('id', 1);// Instead of:if ($this->_hasParam('id') {  $id = $this->_getParam('id');} else {  $id = 1;}

視圖的相關(guān)操作

Zend_Controller_Action為視圖繼承提供了一個初步的靈活的機制。有兩個方法來完成這個:initView() 和 render();前者松散地加載$view public 屬性,后者基于當(dāng)前請求的動作來解析視圖,它們使用目錄層次來決定腳本路徑。

視圖初始化

initView()初始化視圖對象。為了讀取視圖對象,render()調(diào)用initView(),但它可以在任何時候被初始化;缺省地,它用Zend_View對象來組裝$view屬性,但任何實現(xiàn)Zend_View_Interface的類可以使用。如果$view已經(jīng)被初始化,它就簡單地返回屬性。

缺省的實現(xiàn)使用下面假設(shè)的目錄結(jié)構(gòu):

applicationOrModule/
    controllers/
        IndexController.php
    views/
        scripts/
            index/
                index.phtml
        helpers/
        filters/

換句話說,視圖腳本假定放在views/scripts/子目錄,同時假定 views子目錄還包含兄弟功能(助手和過濾器)。確定視圖腳本名稱和路徑時,先以 views/scripts/作為基路徑,然后加上以視圖腳本對應(yīng)控制器命名的目錄。

解析(Rendering)視圖

render() 有下列特征:has the following signature:

string render(string $action = null,       string $name = null,       bool $noController = false);

render()解析視圖腳本。如果沒有傳遞參數(shù),它假定請求的腳本是[controller]/[action].phtml (.phtml是$viewSuffix屬性的值)。為$action傳遞一個值將解析在[controller]子目錄中的模板。為用[controller]重寫,傳遞一個true值給$noController。最后,模板被解析到響應(yīng)對象;如果你希望解析到一個在響應(yīng)對象里指定的named segment,傳遞一個值給$name。

Note: 因為控制器和動作名字里可能包含分隔符如'_'、 '.' 和 '-',當(dāng)決定視圖名字時,render()把它們規(guī)格化成 '-'.在內(nèi)部,它使用派遣器的字和路徑分隔符來做規(guī)格化。這樣,對/foo.bar/baz-bat的請求將解析腳本foo-bar/baz-bat.phtml。如果動作方法包含camelCasing,記住當(dāng)決定視圖腳本文件名的時候,這將變成由'-'分隔的字。

一些例子:

class MyController extends Zend_Controller_Action{  public function fooAction()  {    // Renders my/foo.phtml    $this->render();    // Renders my/bar.phtml    $this->render('bar');    // Renders baz.phtml    $this->render('baz', null, true);    // Renders my/login.phtml to the 'form' segment of the    // response object    $this->render('login', 'form');    // Renders site.phtml to the 'page' segment of the response    // object; does not use the 'my/' subirectory    $this->render('site', 'page', true);  }  public function bazBatAction()  {    // Renders my/baz-bat.phtml    $this->render();  }}

其它

_forward($action, $controller = null, $module = null, array $params = null) :執(zhí)行另外一個動作。如果在preDispatch()里調(diào)用,當(dāng)前請求的動作將被跳過來支持新的動作。否則,在當(dāng)前動作被處理之后,在_forward()請求的動作將被執(zhí)行。

_redirect($url, array $options = array()):重定向到另外一個地方。這個方法用URL和一組可選的選項。缺省地,它執(zhí)行HTTP 302 重定向。

選項可包括一個或多個下面這些:

exit:是否立即退出。如果被請求,它將干凈地關(guān)閉任何打開的會話和執(zhí)行重定向。

可以用setRedirectExit()訪問器在控制器里全局地設(shè)置這個選項。

prependBase:是否預(yù)先考慮基礎(chǔ)URL和URL提供的請求對象一起注冊。

使用setRedirectPrependBase()訪問器,在控制器里全局地設(shè)置這個選項。

code:在重定向時要用什么HTTP代碼。缺省使用302;可以用從301到306之間的任何代碼。

使用setRedirectCode()訪問器,在控制器里全局地設(shè)置這個選項。

擴展自定義Zend_Controller_Action

為了創(chuàng)建動作控制器,設(shè)計上,Zend_Controller_Action 必須被繼承。至少,需要定義控制器可能調(diào)用的動作方法。

除了為web應(yīng)用程序創(chuàng)建有用的函數(shù)外,你可能發(fā)現(xiàn)在不同的控制器里重復(fù)同樣的設(shè)置和實用方法;如果這樣,創(chuàng)建一個繼承(extends)Zend_Controller_Action 的基礎(chǔ)類可能會解決問題。

Example #1 如何處理不存在的動作

如果控制器的請求包括一個未定義的動作方法,Zend_Controller_Action::__call()將被調(diào)用。__call()當(dāng)然是PHP中用來重載方法的魔術(shù)方法。

缺省地,這個方法拋出一個Zend_Controller_Action_Exception 來表明在控制器里沒有發(fā)現(xiàn)要求的方法。如果要求的方法以'Action'結(jié)尾,就假設(shè)一個動作被請求并且不存在;這樣的錯誤導(dǎo)致帶有代碼為 404 的異常。所有其它方法導(dǎo)致帶有代碼為 500 的異常。這使你很容易地在錯誤句柄里區(qū)分是頁面沒有發(fā)現(xiàn)還是程序錯誤。

如果想執(zhí)行其它操作,你應(yīng)該重寫這個函數(shù)。例如,如果你想顯示錯誤信息,可以象下面這樣來寫:

class MyController extends Zend_Controller_Action{  public function __call($method, $args)  {    if ('Action' == substr($method, -6)) {      // If the action method was not found, render the error      // template      return $this->render('error');    }    // all other methods throw an exception    throw new Exception('Invalid method "'              . $method              . '" called',              500);  }}

另外的可能性就是你可能想轉(zhuǎn)發(fā)到缺省控制頁面:

class MyController extends Zend_Controller_Action{  public function indexAction()  {    $this->render();  }  public function __call($method, $args)  {    if ('Action' == substr($method, -6)) {      // If the action method was not found, forward to the      // index action      return $this->_forward('index');    }    // all other methods throw an exception    throw new Exception('Invalid method "'              . $method              . '" called',              500);  }}

為了定制控制器,除了重寫__call()以外,本章前面說涉及的初始化、實用程序、訪問器、視圖和派遣鉤子等方法都可以被重寫。作為例子,如果把視圖對象保存到注冊表里,你可能想用象下面的代碼來修改initView():

abstract class My_Base_Controller extends Zend_Controller_Action{  public function initView()  {    if (null === $this->view) {      if (Zend_Registry::isRegistered('view')) {        $this->view = Zend_Registry::get('view');      } else {        $this->view = new Zend_View();        $this->view->setBasePath(dirname(__FILE__) . '/../views');      }    }    return $this->view;  }}


注:相關(guān)教程知識閱讀請移步到PHP教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
久久久男人的天堂| 亚洲激情图片qvod| 日本老熟俱乐部h0930| 日韩精品久久久久久久电影99爱| 日日骚av一区| caoporn国产精品免费视频| 国产婷婷色一区二区三区四区| 香蕉视频禁止18| caoporn国产精品| 黄色免费视频观看| 人人妻人人澡人人爽欧美一区| 欧美顶级毛片在线播放| 开心婷婷激情五月| 国产午夜精品福利| 先锋影音亚洲资源| 免费成人蒂法网站| 草草影院在线| 麻豆三级在线观看| 国产午夜大地久久| 国产精品视频入口| 希岛爱理一区二区三区| 在线a欧美视频| 91夜夜蜜桃臀一区二区三区| 男生操女生视频网站| 亚洲制服一区| 成人动漫一区二区三区| 午夜天堂在线视频| 久久一区二区三区超碰国产精品| 国产精品久久久久久久久久久新郎| aaa级精品久久久国产片| 国产成人午夜精品5599| 99国产在线视频| 伊人色综合久久久| 欧美一区=区| 国产精品一二三产区| 成 人 黄 色 片 在线播放| 国产一区二区久久久| 中文在线a√在线8| av鲁丝一区鲁丝二区鲁丝三区| 欧美视频日韩视频在线观看| 91免费综合在线| 四虎影视最新网站入口在线观看| 尤物国产精品| 捆绑裸体绳奴bdsm亚洲| 精品日产乱码久久久久久仙踪林| 国产在线不卡一区| 好吊色欧美一区二区三区四区| 午夜伦理精品一区| 免费看大片爽| 亚洲欧洲一级| 91麻豆精品国产91久久久久久| 欧美一级二级视频| 韩国三级电影在线观看婷婷| 精品一区久久| 国产精品草莓在线免费观看| 日韩电影免费观看高清完整版| 日韩欧乱色一区二区三区在线| 99国产高清| 波多野结衣家庭教师在线观看| 欧美一二三四五区| 国产精品一级片| 91日本视频在线| 日本精品视频在线播放| 国产对白叫床清晰在线播放| 四虎免费视频| 免费看黄在线看| 在线观看av一区| 亚洲国产果冻传媒av在线观看| 国产麻豆精品theporn| 伊人久久大香| 激情内射人妻1区2区3区| 国产美女福利在线观看| 色吊丝中文字幕| 久久综合国产精品| 欧美多人野外伦交| 四虎成人精品永久免费av九九| 波多野结衣激情视频| 亚洲国产精品va在线观看黑人| 91在线视频免费91| 日韩黄色小视频| 亚洲午夜久久久久久久| 国产在线看片免费视频在线观看| 亚洲欧美在线网| 成人av一级片| 四虎国产精品成人永久免费影视| 蜜桃久久精品成人无码av| 国产亚洲精彩久久| 在线视频中文字幕久| 国产成人综合网站| 欧美成人片在线观看| 亚洲一区二区三区在线观看网站| 高清一区二区视频| 成人网在线播放| 欧美网色网址| 精品综合久久久久久97| 亚洲一区免费看| a视频在线看| 亚洲欧美日本国产| 国产又粗又猛又爽又黄| 北条麻妃一区二区三区中文字幕| 处破女av一区二区| 欧美精品久久一区| 欧美极品少妇videossex| 日韩成人xxxx| 日韩欧美亚洲在线| 欧美乱妇一区二区三区不卡视频| 亚洲最大色图| 久久久www成人免费精品张筱雨| 日本免费网站| 欧美美女啪啪| 日韩免费中文字幕| 最新欧美精品一区二区三区| 欧洲激情综合| 日韩你懂的电影在线观看| 四虎国产精品永久| 黄色成人av在线| 永久在线免费观看| 成人av网站在线观看免费| 国产精品国产三级在线观看| 日本在线视频网址| 亚洲精品在线不卡| 亚洲成人aaa| 国精品日韩欧美一区二区三区| 精品久久久国产精品999| 在线一区二区三区精品| 国产综合自拍| 国产成人精品久久亚洲高清不卡| 日韩成人一区二区三区在线观看| 亚洲综合中文| 91社影院在线观看| 国产精品77777竹菊影视小说| 91精品啪在线观看国产81旧版| 久久亚洲在线| 久久精品福利| 免费精品99久久国产综合精品应用| 国产成人精品一区二区三区视频| 国产调教在线观看| 制服丝袜影音| 国产精品美女xx| 区一区二在线观看| 性欧美大胆高清视频| 成人欧美一区| 精品久久久久久久久久久国产字幕| 水蜜桃久久夜色精品一区的特点| 三级成人在线| 欧美家庭影院| 亚洲人成伊人成综合图片| 国产精品无码专区av免费播放| 国产 日韩 欧美在线| 久久久9色精品国产一区二区三区| 77777亚洲午夜久久多人| 中文字幕日韩精品久久| 美女av一区二区| 天天操天天舔天天干| 日韩精品一区二区不卡| 久青草国产在线| 国产精品日日摸夜夜摸av| 一区二区三区免费观看| 亚洲激情在线| 99热手机在线| 永久555www成人免费| 第一会所亚洲原创| 欧美伊人影院| 久草免费在线观看| 国产亚洲精品久久久久久青梅| 精品久久久久久久久久ntr影视| 国产精品日本精品| 亚洲国产综合在线观看| 日韩精品在线免费播放| 日本精品视频在线播放| 成人免费视频app| 国产精选一区二区三区不卡催乳| 成人知道污网站| 久久av老司机精品网站导航| 一本一本a久久| 艳色歌舞团一区二区三区| 亚洲精品欧洲精品| 在线观看国产精品入口| 国产欧美久久久| 亚洲一区二区三区四区在线播放| 欧美日本高清视频在线观看| 好好的日comwww| 中文精品久久久久人妻不卡| 国产超碰精品在线观看| 精品中文字幕一区| 日本美女一级视频| 国产激情久久久| 又粗又大的机巴好爽欧美| 欧洲亚洲精品久久久久| 国产肉体xxxx裸体784大胆| 午夜精品一区二区三区四区| 亚洲欧美另类在线视频| 亚洲欧洲一区二区天堂久久| 亚洲综合色一区| av在线影音| 777久久久精品一区二区三区| 蜜臀av性久久久久蜜臀aⅴ四虎| 成人h视频在线观看| 国产欧美精品久久| 婷婷激情综合五月天| 成人h在线播放| 国产玉足脚交久久欧美| 欧美视频免费一区二区三区| 欧美另类69xxxx| 99九九视频| 国产乱一区二区| 日韩中文字幕一区二区三区| 久久精品在线视频| 亚洲成色www8888| 国产成人综合精品在线| 日韩欧美亚洲国产精品字幕久久久| www.天天操| 日韩在线视频在线观看| 日本在线免费观看| 一级全黄少妇性色生活片| 成人黄色片在线观看| 污污的网站18| 成人黄色片在线观看| 亚洲区一区二区三区| 农村妇女精品一区二区| 国产香蕉在线观看| 97se在线视频| 久久久久国产美女免费网站| 成人福利一区二区| 欧美日韩精品一区二区三区视频播放| 亚洲一线在线观看| 欧美片一区二区三区| 久久66热这里只有精品| 精品国产午夜福利在线观看| 欧美麻豆久久久久久中文| 久久免费的精品国产v∧| 女同性一区二区三区人了人一| 91浏览器在线视频| 国产超碰人人模人人爽人人添| 国产福利资源在线| 亚洲欧美另类自拍| 成人丝袜视频网| 国产精品一色哟哟哟| 福利视频网站一区二区三区| 国产美女精品写真福利视频| 国产精品电影院| 成人黄色免费视频| 久久久久久草| 成人动漫视频在线| 男女激情视频网站| 国产在线精选视频| 欧美午夜理伦三级在线观看| 久色乳综合思思在线视频| 5g成人永久免费影院| 久久一级黄色片| 在线观看免费高清视频97| 日韩伦理在线| 国产亲近乱来精品视频| 日本亚洲欧洲色| 日韩欧美在线观看免费| 亚洲美女视频在线免费观看| 五月综合网站| 亚洲日本一区二区三区| 欧美一区二区三区成人片在线| 在线精品亚洲欧美日韩国产| 嫩草嫩草嫩草嫩草嫩草| 国产成人久久精品77777综合| 欧美h视频在线观看| 亚洲第一页在线观看| 无码h肉动漫在线观看| 美女扒开尿口让男人操| 97视频在线| 91无套直看片红桃| 亚洲永久免费视频| 2021天天操| 欧美日韩国产高清一区二区三区| 精品国产中文字幕| 色综合久久久久久久久久久| 国产在线观看av| 手机看片日韩国产| 国产丝袜在线精品| 一级片免费在线观看| 一区二区福利视频| 亚洲第一香蕉视频| 在线能看的av网址| 欧美高清性粉嫩交| 成年在线播放小视频| 欧美中在线观看| 国产在线拍揄自揄拍无码视频| 成年网站在线观看视频| 国产一区二区三区高清在线观看| 久久国产柳州莫菁门| 亚洲欧美国产高清| 91夜夜未满十八勿入爽爽影院| 麻豆成人av| 91国偷自产一区二区开放时间| 伊人网伊人影院| 久久伊人影院| 国产va免费精品观看精品| 五月天激情开心网| 男人和女人啪啪网站| 又粗又硬又爽国产视频| 性高爱久久久久久久久| 国产精品婷婷午夜在线观看| 亚洲精品乱码久久久久| av免费在线免费观看| 成人毛片老司机大片| 黄色不卡一区| 国内精品写真在线观看| 精品一区二区三区四区| 高清国产免费| 亚洲韩国精品一区| 深夜视频在线观看| 欧美日韩国产中字| 五月天免费网站| 99久久99久久免费精品蜜臀| 国产乱码精品一区二区三区中文| 成人黄色av片| 尤物精品在线| 羞羞视频网站在线观看| 夜夜嗨av一区二区三区免费区| 五月天国产精品| eeuss影院www免费影院| 本网站久久精品| 亚洲调教一区| 伊人久久大香线蕉午夜av| av在线网址导航| www.狠狠操.com| av在线1区2区| 男人天堂一区二区| 久久69精品久久久久久国产越南| 日韩欧美三级在线| 欧美日韩精品在线观看视频|