tp 框架開發整理總結

Shine-x發表於2019-06-19

官方文件

https://www.kancloud.cn/manual/thinkphp/16...

大寫字母的用法

  • A函式用於例項化控制器
  • 格式:[資源://][模組/]控制器 A($name,$layer='',$level='')
    @param string $name 資源地址
    @param string $layer 控制層名稱
    @param integer $level 控制器層次
    @return Controller|false

B執行某個行為 B($name,$tag='',&$params=NULL)

@param string $name 行為名稱
@param string $tag 標籤名稱(行為類無需傳入)
@param Mixed $params傳入的引數 @return void

這是隨著行為應運而生的新生函式,可以執行某個行為,例如B('app_begin');
就是在專案開始之前,執行這個行為定義的所有函 數,支援2個引數,第二個引數支援需要接受一個陣列

例如

B('app_begin',array("name"=>"tdweb","time"=>time())); 

C 讀取及設定配置引數C($name=null,$value=null,$default=null)

@paramstring|array $name 配置變數
@param mixed $value 配置值
@param mixed $default 預設值
@return mixed

獲取值:  

  • 獲取所有設定:C(); 不傳遞任何引數,返回一個包含所有設定的陣列。
  • 獲取指定配置:C('URL_MODEL') 這樣就能得到URL_MODEL的配置資訊
  • 獲取指定二維陣列配置:C("array.name"),這樣就返回陣列array下的key為name所對應的值

設定值:

  • 為二維陣列賦值C("array.name","value"),原理同上(獲取array.name的值),後邊的value是值
  • 批量賦值:
    $test=array("URL_MODEL"=>1,"THIN_MODEL"=>true");
    C($test);  這樣直接將陣列裡的值賦值了

    判斷是否賦值:

    C("?URL_MODEL")這樣前邊加個"?",如果已經賦值,則返回true

    需要說明的是,這裡雖然更改了配置的值,但是僅僅是這個頁面做了更改,到下個頁面就不起作用了,
    如果想改就永久更改,那麼需要配合F函式,將配置檔案寫入config.PHP才行。


D函式用於例項化模型類格式 [資 源://][模組/]模型 D($name='',$layer='')

@param string $name 資源地址
@param string $layer 模型層名稱
@return Model

D函式有2個優點:

  • 一是如果之前例項化過這個Model,那麼就不再例項化了,省資源;
  • 二是方便除錯,如果不存在 這個Model,會丟擲TP異常,非常人性化。
    如果訪問本專案的Model直接D("Model名稱");就可以了,如果打算跨專案訪問,就使用 D("Model名稱","專案名稱");

E丟擲異常處理 E($msg, $code=0)

@param string $msg異常訊息
@param integer $code 異常程式碼預設為0
@return void

F快速檔案資料讀取和儲存針對簡單型別資料字串、陣列 F($name, $value='',$path=DATA_PATH)

@param string $name 快取名稱
@param mixed $value 快取值
@param string $path 快取路徑
@return mixed
  • 快速儲存資料:F("mydata","這裡是要儲存的資料"),這樣就在專案Data目錄下儲存了一個名叫mydata.php的檔案,裡邊的內容是該函式的第二個引數。
  • 指定儲存時間 :F("mydata","這裡是要儲存的資料","60"),這樣,如果下次再訪問,間隔大於60秒則刪除次快取檔案。
  • 指定儲存目錄:F("mydata","這裡是要儲存的資料","60",DATA_PATH) ,這樣就指定儲存在data目錄下
  • 立即刪除快取:F("mydata",null),第二個引數傳遞一個null值,這樣就刪除了mydate這個快取
  • 讀取快取資料:F("mydata"),這樣就讀取這個快取了

G記錄和統計時間(微秒)和記憶體使用情況

G($start,$end='',$dec=4)

使用方法:

G('begin'); // 記錄開始標記位 // ... 區間執行程式碼
G('end'); // 記錄結束標籤位
echo G('begin','end',6); //統計區間執行時間精確到小數後6位
echo G('begin','end','m'); // 統計區間記憶體使用情況 如果end標記位沒有定義,則會自動以當前作為標記位

其中統計記憶體使用需要 MEMORY_LIMIT_ON 常量為true才有效

@param string $start 開始標籤
@param string $end 結束標籤
@paraminteger|string $dec小數位或者m
@return mixed

I獲取輸入引數支援過濾和預設值

I($name,$default='',$filter=null)

使用方法:

I('id',0); //獲取id引數自動判斷get或者post
I('post.name','','htmlspecialchar s'); //獲取$_POST['name']
I('get.'); //獲取$_GET

L()獲取和設定語言定義(不區分大小 寫)

L($name=null,$value=null)
@paramstring|array $name 語言變數
@param mixed $value 語言值或者變數
@return mixed

語言定義函式,L("intro")獲取定義成intro的語言,l("intro","介紹")為intro賦值


M函式用於例項化一個沒有模型檔案的Model

M($name='',$tablePrefix='',$connection='')
@param string $name Model名稱支援指定基礎模型例如MongoModel:User
@param string $tablePrefix表字首
@param mixed $connection  資料庫連線資訊
@return Model

N設定和獲取統計資料

N($key,$step=0,$save=false)

使用方法:

N('db',1); // 記錄資料庫操作次數
N('read',1); // 記錄讀取次數
echo N('db'); // 獲取當前頁面資料庫的所有操作次數
echo N('read'); // 獲取當前頁面讀取次數
@param string $key 標識位置
@param integer $step 步進值
@return mixed

R遠端呼叫控制器的操作方法 URL 引數格式 [資源://][模組/]控制器/操作

R($url,$vars=array(),$layer='')
@param string $url呼叫地址
@paramstring|array $vars呼叫引數支援字串和陣列
@param string $layer 要呼叫的控制層名稱
@return mixed

T獲取模版檔案格式資源://模組@ 主題/控制器/操作

T($template='',$layer='')
@param string $name 模版資源地址
@param string $layer 檢視層(目錄)名稱
@return string

U()URL組裝支援不同URL模式

U($url='',$vars='',$suffix=true,$domain=false)
@param string $url URL表示式,格式:'[模組/控制器/操作#錨點@域名]?引數1=值1&引數2=值2...'
@paramstring|array $vars傳入的引數,支援陣列和字串
@param string $suffix 偽靜態字尾,預設為true表示獲取配置值
@paramboolean $domain 是否顯示域名
@return string

使用方法:

  • 取得當前模組的Action地址 :U("/nowMethod");
  • 取得當前模組的Action地址,並傳遞引數:U("/nowMethod?params=test");
  • (如果不習慣上邊那種方式,可以使用U("/nowMethod",array("params"=>"test");這樣的陣列方式傳遞引數,效果是一樣的)
  • 訪問其他模組的方法:U("Other/otherMethod"),這樣就是訪問Other模組下的otherMethod方法

跨專案訪問:

U("appname://Other/otherMethod");

使用路由訪問:

U("appName://routeName@moduleName/actionName?params");

另外,如果想直接跳轉,那麼就在第二個引數寫1

U("/nowMethod",1)

這樣就直接調轉到指定URL了


W渲染輸出Widget

W($name,$data=array())
@param string $name Widget名稱
@param array $data 傳入的引數
@return void

S快取管理

S($name,$value='',$options=null)
@param mixed $name 快取名稱,如果為陣列表示進行快取設定
@param mixed $value 快取值
@param mixed $options 快取引數
@return mixed
  • 全域性快取讀寫函式,和C類似,不過是直接寫成檔案,寫在Temp目錄下,不過在快取有一點需要注意,
  • 如果快取名稱是aaa,那麼快取生成的檔名稱就是md5("aaa")的值。

技術

防止xss攻擊

簡單的防止

當網站不涉及複雜的使用者互動時,可以對使用者所有提交的文字進行htmlspecialchars函式處理。

  • 版本為:3.2
  • 步驟:
    • 一:在專案配置檔案中新增配置: 'DEFAULT_FILTER' => 'htmlspecialchars', //預設過濾函式
    • 二: 使用框架帶的I方法獲取來自使用者提交的資料;
  • 例子

    • M('Member')->save(array('content'=>I('post.content')));

對COOKIE進行IP繫結

  • cookie的資訊一但被別人通過XSS攻擊獲取後也一樣等同於把自己的帳號密碼給了別人。
  • 對cookie進行IP繫結,(當然也可以獲取使用者客戶端更多的其它資訊進行同時繫結)可以根據使用者的IP來判斷這個cookie是不是來原始授權使用者。

示例

  • 使用者設定了自動登入時儲存自動登入資訊:
    $auto=I('post.auto');//使用者設定了自動登入
    if(!empty($auto)){
    cookie('auto',encrypt(serialize($data)));//將登入資訊儲存到cookie,其中$data裡含有加密後的帳號,密碼,和使用者的IP,這裡的cookie已在全域性中設定過期日期為一週
    }
  • 使用者關閉瀏覽器再次訪問網站時,進行自動登入
    if (!is_login()) {//是否未登入狀態?
    $auth=cookie('auto');
        if(!empty($auth)){//是否未有自動登入cookie?
            $data=unserialize(decrypt($auth));
                if(!empty($data) && !empty($data['username']) && !empty($data['password']) && !empty($data['last_login_ip'])){
                    $user=M('Member')->where(array('username'=>$data['username'],'password'=>$data['password']))->find();
                        if(!empty($user['id'])&&($user['last_login_ip']==get_client_ip())){//cookie帳號密碼是否有效?//IP來源是否相同?
                            login_session($user['id'], $user['username'], $data['last_login_ip']);//使用者自動登入成功
                        }
                }
        }
    }
  • 優點:大多數場景下可使被XSS攻擊盜取的cookie失效。
  • 缺點:由於IP存在多臺電腦共用的可能,對繫結做不到十分精細

為COOKIE新增httponly配置

可以保證cookie只在http請求中被傳輸,而不被頁面中的指令碼獲取,現市面上絕大多數瀏覽器已經支援。

HTML5的新特性:

<iframe src="http://alibaba.com" sandbox>

為iframe的增加的sandbox屬性,可以防止不信任的Web頁面執行某些操作.相信這個方法以後會被廣泛使用。

富文字過濾

官方文件

https://www.kancloud.cn/manual/thinkphp5/1...

技術

簡單的使用

model

<?php
namespace app\admin\model;
use think\Model;
class Auth extends Model
{
    protected $table = 'auth'; //設定表名
}

server

logic

api

<?php
namespace app\admin\server\logic\api;
interface index
{
    public function index();  //定義方法
}
<?php
namespace app\admin\server\logic;
use app\admin\server\logic\api\index;
use app\admin\model\Auth;
//使用類來實現介面
class Show implements index
{
    public function index()
    {
        $auth = Auth::where('id', '>', 0)->select()->toArray(); //呼叫model返回資料並轉化為陣列格式
        return $auth;
    }
}
Facade
<?php
namespace app\admin\server\Facade;
use think\Facade;
class Admin extends Facade
{
    protected static function getFacadeAccessor()
    {
        return app\admin\server\logic\Show::class;  //返回類例項
    }
}

app下的common應用公共檔案

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------
// 應用公共檔案
use think\Loader;
use think\Facade;
// 門面繫結,定義的門面類,自動化要實現的類
Facade::bind(
    [
        app\admin\server\Facade\Admin::class => app\admin\server\logic\Show::class,
    ]
);
//給一個定義的門面類起別名
Loader::addClassAlias([
    'Admins' => app\admin\server\Facade\Admin::class,
]);
traits

api 定義介面返回的資料

<?php
namespace app\admin\server\traits\api;
trait AdTrait
{
    public function adfrom($data = '')
    {
        return array_map(function ($data) {
            return $data;
        }, $data);
        // return array_map(function ($data) {
        //     return $data = [
        //         "Id" => $data['Id'],
        //         "type_name" => $data["type_name"],
        //         "pid" => $data["pid"],
        //     ];
        // }, $data);
    }
}

mes 定義返回的json格式

<?php
namespace app\admin\server\traits\mes;
trait Apimessages
{
    public function backSuccessMsg($goods, $SuccessStatus, $falseStatus)
    {
        if ($goods) {
            return json_encode([
                'status' => 'success',
                'status_code' => $SuccessStatus,
                'msg' => '呼叫成功',
                'data' => ["goods" => $goods]
            ]);
        } else {
            return json_encode([
                'status' => 'false',
                'status_code' => $falseStatus,
                'msg' => '呼叫失敗',

            ]);
        }
    }
}

controller

<?php
namespace app\admin\controller;
use think\Controller;
use Admins;
use  \app\admin\server\traits\api\AdTrait;
use  \app\admin\server\traits\mes\Apimessages;
class Indexs extends Controller
{
    //呼叫自定義的Adtrait  和  Apimessages
    use AdTrait;
    use Apimessages;
    public  function index()
    {
        //Admins::index()獲取資料 $this->adfrom轉化定義的adfrom 資料格式
        $admin = $this->adfrom(Admins::index());
        //定義成功和失敗的錯誤碼
        $SuccessStatus = 1000;
        $FalseStatus = 1001;
        //返回定義的Apimessages json格式
        return $this->backSuccessMsg($admin, $SuccessStatus, $FalseStatus);
    }
}

thinkphp exp的用法

在vendor表中查詢出vendor_id = vendor_f_id的資料

select * from  vendor where vendor_id = vendor_f_id

但是,在thinkphp中為了程式碼的簡潔以及通用性,不考慮使用原生的方式進行sql的查詢,而是採用查詢map的方式進行查詢

$condition[ 'vendor_f_id' ] = 'vendor_id';

thinkphp在處理上述條件的時候,將其轉化為了以下程式碼:

select * from vendor where vendor_f_id = 'vendor_id'

vendor_id被當成了一個字串進行處理了

$condition``[ ``'vendor_f_id'` `] = [ ``'exp'` `, ``' = vendor_id '` `]
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章