ThinkPHP 3を用いる.2.3 ThinkAdmin携帯電話パソコン共通の告白壁を作成する(七)最適化:アクセス制御

2805 ワード

この告白壁の最初の設計は、パソコン側は弾幕と微信のQRコードしか見られず、移動側は弾幕を提供し、白い情報を発表し、告白壁を見るなどの機能を提供している.
したがって、対応するコードを変更してこのアクセス制御を実現するには、異なるデバイスでのアクセスインタフェースの乱れを避ける必要があります.
最も簡単な考え方は、携帯電話側の各ページにデバイス判断コードを追加して実現することであるが、このようにして同じコードが多く発生する.この問題はオブジェクト向けの継承で簡単に解決できる.
Mobile/Clontroller/BaseControllerを新規作成します.class.phpは各移動ページのControllerに継承するので、BaseControllerで一度だけ実現すればコード冗長性の問題を解決できる.ThinkPHPを使用した初期化関数_initialize()にあります.
Mobile/Controller/BaseController.class.php
<?php
namespace Mobile\Controller;
use Think\Controller;
class BaseController extends Controller{
	public function _initialize(){//     
		if(!$this->isMobile()){
    		$this->redirect('/Home/');
    	}
	}

	function isMobile(){
      //    HTTP_X_WAP_PROFILE        
      if (isset ($_SERVER['HTTP_X_WAP_PROFILE']))
          return true;
   
      //    TPM        ,  TPM  
      if(isset ($_SERVER['HTTP_CLIENT']) &&'PhoneClient'==$_SERVER['HTTP_CLIENT'])
          return true;
      
      //  via    wap        ,           
      if (isset ($_SERVER['HTTP_VIA']))
          //    flase,   true
          return stristr($_SERVER['HTTP_VIA'], 'wap') ? true : false;
      //            ,       
      if (isset ($_SERVER['HTTP_USER_AGENT'])) {
          $clientkeywords = array(
              'nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile'
          );
          // HTTP_USER_AGENT            
          if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
              return true;
          }
      }
      //   ,        ,      
      if (isset ($_SERVER['HTTP_ACCEPT'])) {
          //      wml     html        
          //     wml html  wml html        
          if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
              return true;
          }
      }
      return false;
    }
	
}
というisMobile関数は使用頻度が高く、複数のモジュールが使用するので、共通の方法に書くこともできますが、Comon/functionに書いてみました.phpでは機能しません