tp5 小知識

tp5 路由相關:

Route::domain('api.com', 'api');
# 路由1
Route::get('v1/users/recordDetail','@api/v1.users/recordDetail');
# 路由2
Route::get('v1/users/recordDetail','v1.users/recordDetail');
域名已經綁定模塊的前提下:

路由1中 又綁定了模塊,這個時候 如果在config裏面 採用模塊配置 (新建api文件夾,裏面寫配置文件)這種情況下 配置參數無法獲取。只能是在config文件夾下 直接新建api.conf 在其中寫配置參數 才能用config()正常獲取 。

路由2中 沒有再次綁定模塊,這個時候 如果在config裏面 採用模塊配置 (新建api文件夾,裏面寫配置文件)或者是在config文件夾下 直接新建api.conf 在其中寫配置參數 config()都可正常獲取 。

2019年1月14日

tp5 事務相關:

tp5.1.29 開啓事務後,在try catch中 不能使用助手函數 db()->xxxx,助手函數db() 不支持事務回滾。5.2版本已經取消助手函數了,更符合規範。

按照官方文檔上 try catch中應該使用 Db::name()  或者 Db::table()

如果事務中涉及同一張表插入多條不同數據  推薦使用 saveAll ,  saveAll中爲非空二維數組,如果有主鍵,還需要插入,saveAll第二個參數 爲false  詳情參見 官方文檔

2018年12月10日

 

tp5 路由相關:

 get 方式註冊路由,嚴格區分路由方法的大小寫

Route::get('v1/users/recordDetail','@api/v1.users/recordDetail');
 
Route::get('v1/users/recorddetail','@api/v1.users/recordDetail');
上面是兩個不同的路由。

2018年12月7日

 

tp5 路由相關:

Route::get('v1/users/record/[:type]/[:p]','@api/v1.users/record')->pattern(['p' => '\d+','type' => '\d+']);
規則如上所示:定義的第一個參數是type   第二個是p
 

v1/users/record/1/2 
 
input('param.type')   // 1
input('param.p')      // 2
Route::get('v1/users/record/[:p]/[:type]','@api/v1.users/record')->pattern(['p' => '\d+','type' => '\d+']);
規則如上所示:定義的第一個參數是p   第二個是type

v1/users/record/1/2 
 
input('param.type')   // 2
input('param.p')      // 1
  綜上所述:嚴格按照路由規則中參數的順序匹配參數

 

同時,如果不是可選參數,那麼在方法中的默認參數就是路由參數:

Route::get('v1/users/record/:type/:p','@api/v1.users/record')->pattern(['p' => '\d+','type' => '\d+']);
路由規則如上所示,獲取參數可以: 

注意:這種形式的 只能以pathinfo的形式傳參,query形式的(?type=1&id=2)是無效的

public function record($type, $p)
{
    echo $p, $type;
}
或者 不給函數設置參數,在函數內直接 input('param.type'),   input('param.p') 也可獲取
這種用pathinfo  或者query形式 傳參都可正常接收
2018年12月5日

 

tp5 模板裏獲取當前pathinfo格式的url參數
http://test.local/user/index/id/3
 

{$Request.param.id}    即可正常獲取 3
2018年11月2日

 

多級控制器的資源路由註冊:

// 完整域名綁定到admin模塊
Route::domain('route.local', 'api');
// api接口路由
Route::resource('v1/test','api/v1.test',['domain'=>'route.local']);
Route::resource('v1/UserType','api/v1.UserType',['domain'=>'route.local']);
以上面的爲例,當訪問 route.local/v1/test   會路由到  api模塊下的 controller/v1/test.php 中的 index方法。

資源路由比下面的全動態路由更加規範,基於 restful api 風格。

2018年10月8日

 

根據url裏的版本號訪問不同的接口的配置(api.dmain.com/v1/user):

前提條件:綁定好了模塊,隱藏了入口文件index.php

然後看路由,如果url是 api.domain.com/v1/user

參考tp5文檔裏面的多級控制器,如果採用多及控制器,還想動態配置訪問的控制器 需要開啓控制器的自動識別(只能寫在全局配置,路由相關的功能只能在應用配置中設置即 application/config.php)

 

'controller_auto_search' => true,
然後就是註冊路由 ,注意,ThinkPHP5.0的路由規則定義是從根目錄開始,而不是基於模塊名的。

Route::rule('<v>-<c>-<a>','v.c/a','',['domain'=>'route.local']);
這樣訪問 api.domain.com/v1/user  最終目錄解析爲  /api/controller/v1/user/index  即api模塊下的controller控制器下的v1文件夾下的user控制器的index方法。我這裏配置的只是一個例子,具體的還要加上域名檢測等參數。

路由規則:

 

2018-5-19

 

 

關於tp5路由的一些想法,如果採用多入口文件,那麼域名可以不變,只需訪問不同的入口文件即可實現前後臺分離,比如public 裏面新建一個admin.php 綁定到admin模塊,那麼 www.xxx.com 訪問的是前臺,www.xxx.com/admin.php 訪問的是後臺,這種是最直接的前後臺區分。

另一種應該是開啓路由,使用路由,對於不同的域名進行前後臺的區分,tp5有Route::domain() 可以根據子域名綁定模塊,這樣就可以在公共文件中把 admin.xxx.com綁定到 admin模塊,www.xxx.com綁定到前臺模塊,api.xxx.com綁定到api模塊(點擊跳轉)

2018-5-17

 

 

模型傳送門

2018-5-6

 

tp5 模型查詢自動分頁

官方手冊上寫的是在controller裏 db(XX)->paginate(10);

在model裏採用分頁可以這樣寫

當前model查詢出數據對象$userList 然後分頁可以用$userList調用render()這個方法,如果你的$userList 是數組 就會報錯:Call to a member function render() on array 。控制器中接收到返回值如下處理:

模板上只需要{$page}即可顯示分頁。

可在官方手冊上搜索:分頁

仔細查看文檔即可。

2018-4-11

 

tp5 表單提交的數組獲取值的時候報錯 ariable type error:array 那麼需要加一個修飾符

官方手冊:

2018-4-7

 

官方手冊上查詢數據都是在控制器直接db('xx')->select();如果在controller裏調用model裏查詢數據的方法,那麼返回給控制器的一般是數據對象,如何把tp5在model裏查詢出的數據對象轉化爲數組呢,手冊上說:5.0.4+ 支持模型中單獨設置查詢數據集的返回對象的名稱:

這樣打印的結果$menulist 即爲數組類型。

18-3-31

 

1.tp5獲取前端傳過來的值

用tp3的時候,表單傳的值直接用$_POST獲取,今天用到tp5的時候,看到了助手函數裏面的input(),支持默認值和過濾。

input($key = '', $default = null, $filter = '') //變量名,默認值,過濾方法

例如

input('post.comments', '掛件', 'htmlspecialchars');

 

2.tp5的model裏查詢結果返回的是對象,那怎麼獲取data裏面的數據呢?

比如$res是返回的對象, 它的data裏面有我們查詢的id和username,

如果是用的find()直接 $res['id']  $res['username'] 即可獲得。

如果是select() 那麼是二維數組,$res[0]['id'],$res[0]['username'] 即可獲得二維數組中的鍵爲0的數組的相關值

有興趣知道原因可看:

http://blog.csdn.net/qq_15096707/article/details/62227624

 

3.tp5 點擊更換驗證碼js

onclick="javascript:this.src=this.src+'?time='+Math.random()" 

直接寫在驗證碼的img標籤裏面,不用寫函數了。

tp5驗證碼常用配置:寫在全局config.php裏面即可。

 

    'captcha' =>    [
            //驗證碼字符集合
            'codeSet' =>        'ASDFGHJKLPUYTREWQXCVBNM123456789asdfghjkmnbvcxqwertyp',
            // 驗證碼位數
            'length'      =>  4,
            //驗證後重置
            'reset'     =>    true,
            //圖片寬度
            'imageW'    =>    150,
            //圖片高度
            'imageH'    =>    30,
            //使用背景圖片  
            "useImgBg"  =>false,
            //驗證碼字體大小(px)
            "fontSize"  =>    17,
            //是否畫混淆曲線
            "useCurve"  =>  true,
            //是否添加雜點  
            "useNoise"  =>    false,
            //驗證碼過期時間(s)
            "expire"  =>    600,
    ],
 

 

 

 

 

4.tp5 數據庫操作新增或保存save()

 

 
模型的新增和更新方法都是save方法,系統有一套默認的規則來識別當前的數據需要更新還是新增。

實例化模型後調用save方法表示新增;
查詢數據後調用save方法表示更新;
save方法傳入更新條件後表示更新;
 

如果你的數據操作比較複雜,可以顯式的指定當前調用save方法是新增操作還是更新操作。

顯式更新數據:

// 實例化模型
$user = new User;
// 顯式指定更新數據操作
$user->isUpdate(true)
    ->save(['id' => 1, 'name' => 'thinkphp']); //最好不要用這個,直接update(條件)來更新
顯式新增數據:

$user = User::get(1);
$user->name = 'thinkphp';
// 顯式指定當前操作爲新增操作
$user->isUpdate(false)->save();
手冊上有聲明:注意不要在一個模型實例裏面做多次更新,會導致部分重複數據不再更新,正確的方式應該是先查詢後更新或者使用模型類的update方法更新。 

那麼更新的時候 直接 $user->update('條件')即可,可不用save()來更新。

新增的時候 用save() 最好指定 isUpdate(false)。

 

 

 

5.{:url()}裏面用變量是不需要引號的,也就是說 直接 {:url($val['url'])} 即可正確解析
18-4-1

 

 

6.tp5 ajax請求返回渲染後的模板

 

 

這個問題出現的原因是因爲我想局部刷新左側菜單,但是我通過返回的數組用Js追加元素的方式刷新以後會出現佈局的偏移,雖然是一點點,但是很難受,最後想到了之前tp3.2.3可以直接返回模板,所以就想在tp5也這麼處理,這樣局部刷新就很簡單,不用遍歷數據,清空,追加等等操作。

正常的請求不都是 echo json_encode($arr)嘛,今天想着把渲染後的模板返回給ajax請求,試了半天也沒試出來,

去TP官方論壇,特意找到了版主問了這個問題,版主幾分鐘後上線回答問題,沒有回答我,估計是我問的太簡單了。

最後在tp羣裏找到了解決的方法。

多次嘗試代碼如下:

 

    $this->assign('res_t',$res_t);  //模板賦值
    $html=$this->fetch('common/left'); //渲染模板,但是不直接return
    return  $html; //輸出返回值  在這裏輸出的就是left.html的頁面內容,輸出的是字符串類型的
 

上面這個是自己結合羣裏提到的試驗出來的,但是實際上還是要看手冊,大腿告訴我,我這麼寫不規範,規範的寫法應該是返回數組,通過js追加元素實現局部刷新,但是寫法還是可以標準一些:

 

 

 

$this->assign('res_t',$res_t);
Config::set('default_ajax_return','html'); //配置ajax默認的返回格式
return $this->fetch('common/left'); //這樣就不會輸出模版,完成渲染並當作返回值,如果沒有上面的配置,return $this->fetch()會報錯
 

至於ajax接收到返回值,只需要用jquery轉換成對象就可以了:

 

console.log($(data).html())   //這個輸出的就是html內容。$(data) 就把返回值data由字符串格式轉換成了對象

對於這個問題像個半天,總結了一下還是自己看手冊沒看全,如果知道更改了默認格式就可以 return $this->fetch();那麼就不會折騰一下午了。當然,最後也發現遍歷數組追加元素偏移的原因是一個class 屬性少了一個字母...少了一個字母...一個字母....

 

 

 

當然了,這也是經驗,畢竟自己踩過的坑,印象才最深刻,還是要感謝新加的羣裏的大神們的熱心幫助,讓我找到了解決問題的門路,獨學而無友,則孤陋而寡聞。

當工作環境已經沒人能給你思路,自己也看不見能讓技術提高的機會的時候,趁着年輕,多走走。

 

 

7.tp5 url帶參數,url傳參數get不到

 

格式

 

 {:url('admin/index/index',['id'=>1,'name'=>'admin'])}

控制器裏獲得參數不能用$_GET

 

 

$request = Request::instance();
$res=$request->param();
halt($res);//包含id和name
 

8.tp5關聯模型,關聯模型後查詢結果對象取值,關聯模型在model裏進行查詢

 

 

後記:關聯模型好像不能關聯刪除和更新(可能是我操作的不對,也可能是本身就不可以了),關聯模型查詢出來的數據對象取值又比較麻煩,鑑於不能關聯刪除,已經沒有優勢,還是用鏈式操作進行關聯查詢吧 (2017-11-29)

今天看了一下關聯模型,在手冊上的例子都是在控制器中直接查詢數據,如果在model裏查詢數據該怎麼關聯查詢呢?

首先,需要設置關聯模型:

 

     //關聯模型
      public function connectmenushow(){  //一對一關聯 還有一對多和從屬關聯,這裏不列舉了,去手冊上看
        return $this->hasOne('AdminMenuShow', 'uid', 'id')->field('uid,menu_id');  
    } 
hasOne('a','b','c')//關聯的模型a,外鍵b,當前模型的主鍵c

 

上面設置的關聯模型爲 adminmenushow這張表,外鍵是uid  當前表的主鍵是id 關聯查詢字段是uid 和menu_id(設置關聯手冊上有例子)

 

如果關聯模型不懂的話 可以看這篇文章:http://blog.csdn.net/github_37512301/article/details/75675054

我想說的是查詢數據和取出值:

手冊上的例子是在控制器裏用db 連接數據庫查詢,在model裏這樣查詢:

 

    public function show_admin(){
        $res=self::with('connectmenushow')->select();//connectmenushow 是上面設置關聯的函數名
        foreach ($res as $k => $v) {
            //關聯模型數據對象
            $obj = $v->relation;
            $arr[$k]['menu_id'] = $obj["connectmenushow"]['menu_id'];   //這是關聯模型的數據
            $arr[$k]['username'] = $v['username'];//主表數據
            $arr[$k]['password'] = $v['password'];//主表數據
        
        }
        halt($arr);
        
    }

主要用到了 with() ,打印結果是對象,但是對象裏面有個relation屬性,如圖:

 

這裏麪包含上面關聯模型設置的表裏面的字段數據,獲取這些數據要先從$v這個對象中選中這個屬性,然後選中數組,然後先擇相應的下標,這樣即可獲得關聯查詢的所有內容。
--------------------- 
作者:掛件 
來源:CSDN 
原文:https://blog.csdn.net/benpaodelulu_guajian/article/details/78488938 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章