tp5框架知識點

項目包含的關鍵點,後臺,前臺。javascript

入口文件。php

通用配置文件。css

數據庫配置文件。html

共有文件,css,images,js。java

控制器,模型,視圖。thinkphp

共有類。數據庫

共有函數。json

屬性,方法。數組

命名規範。瀏覽器

命名空間。

自動加載。

數據庫操做。

基本查詢

查詢一個數據使用:

// table方法必須指定完整的數據表名
Db::table('think_user')->where('id',1)->find();

find 方法查詢結果不存在,返回 null

查詢數據集使用:

Db::table('think_user')->where('status',1)->select();

select 方法查詢結果不存在,返回空數組

若是設置了數據表前綴參數的話,可使用

Db::name('user')->where('id',1)->find();
Db::name('user')->where('status',1)->select();

若是你的數據表沒有使用表前綴功能,那麼name和table方法的同樣的效果。

findselect方法以前可使用全部的鏈式操做方法。

默認狀況下,find和select方法返回的都是數組。

助手函數

系統提供了一個db助手函數,能夠更方便的查詢:

db('user')->where('id',1)->find();
db('user')->where('status',1)->select();

添加一條數據

使用 Db 類的 insert 方法向數據庫提交數據

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')->insert($data);

若是你在database.php配置文件中配置了數據庫前綴(prefix),那麼能夠直接使用 Db 類的 name 方法提交數據

Db::name('user')->insert($data);

insert 方法添加數據成功返回添加成功的條數,insert 正常狀況返回 1

添加數據後若是須要返回新增數據的自增主鍵,可使用getLastInsID方法:

Db::name('user')->insert($data);
$userId = Db::name('user')->getLastInsID();

或者直接使用insertGetId方法新增數據並返回主鍵值:

Db::name('user')->insertGetId($data);

insertGetId 方法添加數據成功返回添加數據的自增主鍵

添加多條數據

添加多條數據直接向 Db 類的 insertAll 方法傳入須要添加的數據便可

$data = [
    ['foo' => 'bar', 'bar' => 'foo'],
    ['foo' => 'bar1', 'bar' => 'foo1'],
    ['foo' => 'bar2', 'bar' => 'foo2']
];
Db::name('user')->insertAll($data);

insertAll 方法添加數據成功返回添加成功的條數

助手函數

// 添加單條數據
db('user')->insert($data);

// 添加多條數據
db('user')->insertAll($list);

更新數據表中的數據

Db::table('think_user')
    ->where('id', 1)
    ->update(['name' => 'thinkphp']);

若是數據中包含主鍵,能夠直接使用:

Db::table('think_user')
    ->update(['name' => 'thinkphp','id'=>1]);

update 方法返回影響數據的條數,沒修改任何數據返回 0

若是要更新的數據須要使用SQL函數或者其它字段,可使用下面的方式:

Db::table('think_user')
    ->where('id', 1)
    ->update([
        'login_time'  => ['exp','now()'],
        'login_times' => ['exp','login_times+1'],
    ]);

更新某個字段的值:

Db::table('think_user')
    ->where('id',1)
    ->setField('name', 'thinkphp');

setField 方法返回影響數據的條數,沒修改任何數據字段返回 0

自增或自減一個字段的值

setInc/setDec 如不加第二個參數,默認值爲1

// score 字段加 1
Db::table('think_user')
    ->where('id', 1)
    ->setInc('score');
// score 字段加 5
Db::table('think_user')
    ->where('id', 1)
    ->setInc('score', 5);
// score 字段減 1
Db::table('think_user')
    ->where('id', 1)
    ->setDec('score');
// score 字段減 5
Db::table('think_user')
    ->where('id', 1)
    ->setDec('score', 5);

延遲更新

setInc/setDec支持延時更新,若是須要延時更新則傳入第三個參數
下例中延時10秒,給score字段增長1

Db::table('think_user')->where('id', 1)->setInc('score', 1, 10);

setInc/setDec 方法返回影響數據的條數

助手函數

// 更新數據表中的數據
db('user')->where('id',1)->update(['name' => 'thinkphp']);
// 更新某個字段的值
db('user')->where('id',1)->setField('name','thinkphp');
// 自增 score 字段
db('user')->where('id', 1)->setInc('score');
// 自減 score 字段
db('user')->where('id', 1)->setDec('score');

刪除數據表中的數據

// 根據主鍵刪除
Db::table('think_user')->delete(1);
Db::table('think_user')->delete([1,2,3]);

// 條件刪除    
Db::table('think_user')->where('id',1)->delete();
Db::table('think_user')->where('id','<',10)->delete();

delete 方法返回影響數據的條數,沒有刪除返回 0

助手函數

// 根據主鍵刪除
db('user')->delete(1);
// 條件刪除    
db('user')->where('id',1)->delete();

錯誤提示。

API接口數據處理。

路由處理。

緩存機制。

模塊架構與配置。

類庫導入。

系統常量。

配置獲取,配置設置,動態配置。

渲染輸出。

namespace app\index\controller;

class Index 
{
    public function hello()
    {
        return 'hello,world!';
    }
    
    public function json()
    {
        return json_encode($data);
    }
    
    public function read()
    {
        return view();
    }

}

輸出轉換。

namespace app\index\controller;

class Index 
{
    public function hello()
    {
        return 'hello,world!';
    }
    
    public function data()
    {
        return ['name'=>'thinkphp','status'=>1];
    }
    
}
// 默認輸出類型
'default_return_type'   => 'json',

控制器初始化。

namespace app\index\controller;

use think\Controller;

class Index extends Controller
{

    public function _initialize()
    {
        echo 'init<br/>';
    }
    
    public function hello()
    {
        return 'hello';
    }
    
    public function data()
    {
        return 'data';
    }
}

頁面跳轉。

在應用開發中,常常會遇到一些帶有提示信息的跳轉頁面,例如操做成功或者操做錯誤頁面,而且自動跳轉到另一個目標頁面。系統的\think\Controller類內置了兩個跳轉方法successerror,用於頁面跳轉提示。

使用方法很簡單,舉例以下:

namespace app\index\controller;

use think\Controller;
use app\index\model\User;

class Index extends Controller
{
    public function index()
    {
        $User = new User; //實例化User對象
        $result = $User->save($data); 
        if($result){
            //設置成功後跳轉頁面的地址,默認的返回頁面是$_SERVER['HTTP_REFERER']
            $this->success('新增成功', 'User/list');
        } else {
            //錯誤頁面的默認跳轉頁面是返回前一頁,一般不須要設置
            $this->error('新增失敗');
        }
    }
}

跳轉地址是可選的,success方法的默認跳轉地址是$_SERVER["HTTP_REFERER"],error方法的默認跳轉地址是javascript:history.back(-1);

默認的等待時間都是3秒

successerror方法均可以對應的模板,默認的設置是兩個方法對應的模板都是:

THINK_PATH . 'tpl/dispatch_jump.tpl'

咱們能夠改變默認的模板:

//默認錯誤跳轉對應的模板文件
'dispatch_error_tmpl' => APP_PATH . 'tpl/dispatch_jump.tpl',
//默認成功跳轉對應的模板文件
'dispatch_success_tmpl' => APP_PATH . 'tpl/dispatch_jump.tpl',

重定向。

空操做。

空操做是指系統在找不到指定的操做方法的時候,會定位到空操做(_empty)方法來執行,利用這個機制,咱們能夠實現錯誤頁面和一些URL的優化。
例如,下面咱們用空操做功能來實現一個城市切換的功能。

咱們只須要給City控制器類定義一個_empty (空操做)方法:

<?php
namespace app\index\controller;

class City 
{
    public function _empty($name)
    {
        //把全部城市的操做解析到city方法
        return $this->showCity($name);
    }
    
    //注意 showCity方法 自己是 protected 方法
    protected function showCity($name)
    {
        //和$name這個城市相關的處理
         return '當前城市' . $name;
    }
}

接下來,咱們就能夠在瀏覽器裏面輸入

http://serverName/index/city/beijing/
http://serverName/index/city/shanghai/
http://serverName/index/city/shenzhen/

因爲City並無定義beijing、shanghai或者shenzhen操做方法,所以系統會定位到空操做方法 _empty中去解析,_empty方法的參數就是當前URL裏面的操做名,所以會看到依次輸出的結果是:

當前城市:beijing
當前城市:shanghai
當前城市:shenzhen

空控制器

空控制器的概念是指當系統找不到指定的控制器名稱的時候,系統會嘗試定位空控制器(Error),利用這個機制咱們能夠用來定製錯誤頁面和進行URL的優化。
如今咱們把前面的需求進一步,把URL由原來的

http://serverName/index/city/shanghai/

變成

http://serverName/index/shanghai/

這樣更加簡單的方式,若是按照傳統的模式,咱們必須給每一個城市定義一個控制器類,而後在每一個控制器類的index方法裏面進行處理。 但是若是使用空控制器功能,這個問題就能夠迎刃而解了。

咱們能夠給項目定義一個Error控制器類

<?php
namespace app\index\controller;

use think\Request;

class Error 
{
    public function index(Request $request)
    {
        //根據當前控制器名來判斷要執行那個城市的操做
        $cityName = $request->controller();
        return $this->city($cityName);
    }
    
    //注意 city方法 自己是 protected 方法
    protected function city($name)
    {
        //和$name這個城市相關的處理
         return '當前城市' . $name;
    }
}

接下來,咱們就能夠在瀏覽器裏面輸入

http://serverName/index/beijing/
http://serverName/index/shanghai/
http://serverName/index/shenzhen/

因爲系統並不存在beijing、shanghai或者shenzhen控制器,所以會定位到空控制器(Error)去執行,會看到依次輸出的結果是:

當前城市:beijing
當前城市:shanghai
當前城市:shenzhen

空控制器和空操做還能夠同時使用,用以完成更加複雜的操做。

空控制器Error是能夠定義的

// 更改默認的空控制器名
'empty_controller'      => 'MyError',

當找不到控制器的時候,就會定位到MyError控制器類進行操做。

數據請求。

設置/獲取 模塊/控制器/操做名稱

$request = Request::instance();
echo "當前模塊名稱是" . $request->module();
echo "當前控制器名稱是" . $request->controller();
echo "當前操做名稱是" . $request->action();

獲取請求參數

$request = Request::instance();
echo '請求方法:' . $request->method() . '<br/>';
echo '資源類型:' . $request->type() . '<br/>';
echo '訪問ip地址:' . $request->ip() . '<br/>';
echo '是否AJax請求:' . var_export($request->isAjax(), true) . '<br/>';
echo '請求參數:';
dump($request->param());
echo '請求參數:僅包含name';
dump($request->only(['name']));
echo '請求參數:排除name';
dump($request->except(['name']));

獲取路由和調度信息

$request = Request::instance();
echo '路由信息:';
dump($request->route());
echo '調度信息:';
dump($request->dispatch());

變量處理。

能夠經過Request對象完成全局輸入變量的檢測、獲取和安全過濾,支持包括$_GET$_POST$_REQUEST$_SERVER$_SESSION$_COOKIE$_ENV等系統變量,以及文件上傳信息。

檢測變量是否設置

可使用has方法來檢測一個變量參數是否設置,以下:

Request::instance()->has('id','get');
Request::instance()->has('name','post');

或者使用助手函數

input('?get.id');
input('?post.name');

變量檢測能夠支持全部支持的系統變量。

獲取GET變量

Request::instance()->get('id'); // 獲取某個get變量
Request::instance()->get('name'); // 獲取get變量
Request::instance()->get(); // 獲取全部的get變量(通過過濾的數組)
Request::instance()->get(false); // 獲取全部的get變量(原始數組)

或者使用內置的助手函數input方法實現相同的功能:

input('get.id');
input('get.name');
input('get.');

獲取請求類型

在不少狀況下面,咱們須要判斷當前操做的請求類型是GETPOSTPUTDELETE或者HEAD,一方面能夠針對請求類型做出不一樣的邏輯處理,另一方面有些狀況下面須要驗證安全性,過濾不安全的請求。

ThinkPHP5.0 取消了用於判斷請求類型的系統常量(如IS_GET,IS_POST等),統一採用 think\Request類 處理請求類型。

用法以下

// 是否爲 GET 請求
if (Request::instance()->isGet()) echo "當前爲 GET 請求";
// 是否爲 POST 請求
if (Request::instance()->isPost()) echo "當前爲 POST 請求";
// 是否爲 PUT 請求
if (Request::instance()->isPut()) echo "當前爲 PUT 請求";
// 是否爲 DELETE 請求
if (Request::instance()->isDelete()) echo "當前爲 DELETE 請求";
// 是否爲 Ajax 請求
if (Request::instance()->isAjax()) echo "當前爲 Ajax 請求";
// 是否爲 Pjax 請求
if (Request::instance()->isPjax()) echo "當前爲 Pjax 請求";
// 是否爲手機訪問
if (Request::instance()->isMobile()) echo "當前爲手機訪問";
// 是否爲 HEAD 請求
if (Request::instance()->isHead()) echo "當前爲 HEAD 請求";
// 是否爲 Patch 請求
if (Request::instance()->isPatch()) echo "當前爲 PATCH 請求";
// 是否爲 OPTIONS 請求
if (Request::instance()->isOptions()) echo "當前爲 OPTIONS 請求";
// 是否爲 cli
if (Request::instance()->isCli()) echo "當前爲 cli";
// 是否爲 cgi
if (Request::instance()->isCgi()) echo "當前爲 cgi";

助手函數

// 是否爲 GET 請求
if (request()->isGet()) echo "當前爲 GET 請求";

分頁處理。

模板文件定義

每一個模塊的模板文件是獨立的,爲了對模板文件更加有效的管理,ThinkPHP對模板文件進行目錄劃分,默認的模板文件定義規則是:

視圖目錄/控制器名(小寫)/操做名(小寫)+模板後綴

默認的視圖目錄是模塊的view目錄,框架的默認視圖文件後綴是.html

模板渲染規則

模板渲染使用\think\View類的fetch方法,渲染規則爲:

模塊@控制器/操做

模板文件目錄默認位於模塊的view目錄下面,視圖類的fetch方法中的模板文件的定位規則以下:

若是調用沒有任何參數的fetch方法:

return $view->fetch();

則按照系統的默認規則定位模板文件到:

[模板文件目錄]/當前控制器名(小寫+下劃線)/當前操做名(小寫).html

若是(指定操做)調用:

return $view->fetch('add');

則定位模板文件爲:

[模板文件目錄]/當前控制器名(小寫+下劃線)/add.html

若是調用控制器的某個模板文件使用:

return $view->fetch('user/add');

則定位模板文件爲:

[模板文件目錄]/user/add.html

跨模塊調用模板

return $view->fetch('admin@user/add');

全路徑模板調用:

return $view->fetch(APP_PATH.request()->module().'/view/public/header.html');

模板使用函數。

模板使用默認值。

模板使用運算符。

模板內置標籤,循環/比較/條件判斷/嵌套/原生PHP。

表單驗證。

相關文章
相關標籤/搜索