項目包含的關鍵點,後臺,前臺。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方法的同樣的效果。
在find
和select
方法以前可使用全部的鏈式操做方法。
默認狀況下,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
類內置了兩個跳轉方法success
和error
,用於頁面跳轉提示。
使用方法很簡單,舉例以下:
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秒
success
和error
方法均可以對應的模板,默認的設置是兩個方法對應的模板都是:
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.');
在不少狀況下面,咱們須要判斷當前操做的請求類型是GET
、POST
、PUT
、DELETE
或者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。
表單驗證。