1. 程式人生 > >tp5.0的學習筆記

tp5.0的學習筆記

專案目錄

tp5

├─application     應用目錄

├─extend          擴充套件類庫目錄(可定義)

├─public          網站對外訪問目錄

├─runtime         執行時目錄(可定義)

├─vendor          第三方類庫目錄(Composer)

├─thinkphp        框架核心目錄

├─build.php       自動生成定義檔案(參考)

├─composer.json   Composer定義檔案

├─LICENSE.txt     授權說明檔案

├─README.md       README 檔案

├─think           命令列工具入口

TP-四種url訪問的方式

url的4種訪問方式 (這是重點!!)

1.PATHINFO 模式 --重點 在後面使用非常多,如果想傳多個引數可以使用鍵1/值1/鍵2/值2方法

程式碼如下:

http://域名/專案名/入口檔案/模組名/方法名/鍵1/值1/鍵2/值2

2.普通模式也稱為重寫模式

程式碼如下:

http://域名/專案名/入口檔案?m=模組名&a=方法名&鍵1=值1&鍵2=值2

3.REWRITE重寫模式,去掉入口檔案便於SEO優化

程式碼如下:

http://域名/專案名/模組名/方法名/鍵1/值1/鍵2/值2

4.相容模式

程式碼如下:

http://域名/專案名/入口檔案?s=模組名/方法名/鍵1/值1/鍵2/值2

如何修改PATHINFO地址中的/改成-在Home/Conf/config.php中

程式碼如下:

'URL_PATHINFO_DEPR'=>'-',//修改RUL的分隔符,把位址列的引數部分/換成:http://域名/專案名/入口檔案/模組名-方法名-鍵1-值1-鍵2-值2

在index.php中開啟呼叫模式,為了在後產模式中不讓檔案快取影響開發

程式碼如下:

define('APP_DEBUG',ture);//如果設定為ture不快取檔案,false則快取檔案

REWRITE模式開啟方法

在httpd.conf中查詢rewrite_module modules/mod_rewrite.sl 把#去掉重啟服務,在入口檔案下新建.htaccess.php,重寫檔案是去掉index.php的意思:

程式碼如下:

RewriteEngine on  
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]

路由處理過程大概如下:

1.遍歷路由規則rule,與當前PATHINFO字串進行匹配,如果合法,則從PATHINFO中取出所需要的字串。

2.路由中每條規則對應一個router,router中指定對應的模組以及方法,模組和方法可以用第1步中匹配到的字串進行動態替代。

3.將剩餘的引數都解析並寫入到$_GET中。

介面除錯軟體網址

http://www.36nu.com/apiTest

專案目錄

目錄	        說明	        常量

tp5	        專案根目錄	ROOT_PATH

tp5/application	應用目錄	APP_PATH

tp5/thinkphp	框架核心目錄	THINK_PATH

tp5/extend	應用擴充套件目錄	EXTEND_PATH

tp5/vendor	Composer擴充套件目錄	VENDOR_PATH
5.1版本取消了所有的系統常量,改為環境變數獲取
獲取方式為: think\facade\Env::get('環境變數名')

目錄	說明	環境變數
tp5	專案根目錄	root_path
tp5/application	應用目錄	app_path
tp5/thinkphp	框架核心目錄	think_path
tp5/extend	應用擴充套件目錄	extend_path
tp5/vendor	Composer擴充套件目錄	vendor_path

核心框架目錄的結構如下

├─thinkphp 框架系統目錄
│  ├─lang               語言包目錄
│  ├─library            框架核心類庫目錄
│  │  ├─think           think 類庫包目錄
│  │  └─traits          系統 traits 目錄
│  ├─tpl                系統模板目錄
│  │
│  ├─.htaccess          用於 apache 的重寫
│  ├─.travis.yml        CI 定義檔案
│  ├─base.php           框架基礎檔案
│  ├─composer.json      composer 定義檔案
│  ├─console.php        控制檯入口檔案
│  ├─convention.php     慣例配置檔案
│  ├─helper.php         助手函式檔案(可選)
│  ├─LICENSE.txt        授權說明檔案
│  ├─phpunit.xml        單元測試配置檔案
│  ├─README.md          README 檔案
│  └─start.php          框架引導檔案

$this->request->param()

獲取請求引數
https://blog.csdn.net/u012600104/article/details/78845325

啟動服務

在開始之前,你需要一個Web伺服器和**PHP5.4+**執行環境,如果你暫時還沒有,我們推薦使用整合開發環境WAMPServer(Windows系統下整合Apache、PHP和MySQL的服務套件)來使用ThinkPHP進行本地開發和測試,最新版本的WAMP在這裡下載。

如果你不想安裝任何WEB伺服器,也可以直接使用PHP自帶的WebServer,並且執行router.php來執行測試。

我們進入命令列,進入tp5/public目錄後,輸入如下命令:

php -S localhost:8888 router.php

偽靜態引擎

<IfModule mod_rewrite.c> 
    Options +FollowSymlinks -Multiviews 
    RewriteEngine on #開啟rewrite引擎
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1] 
</IfModule>

入口檔案

├─application           應用目錄(可設定)
│  ├─index              模組目錄(可更改)
│  │  ├─config.php      模組配置檔案
│  │  ├─common.php      模組公共檔案
│  │  ├─controller      控制器目錄
│  │  ├─model           模型目錄
│  │  └─view            檢視目錄
│  │
│  ├─command.php        命令列工具配置檔案
│  ├─common.php         應用公共檔案
│  ├─config.php         應用配置檔案
│  ├─tags.php           應用行為擴充套件定義檔案
│  ├─database.php       資料庫配置檔案
│  └─route.php          路由配置檔案

生成demo

php think build --module demo


├─demo   
│  ├─controller      控制器目錄
│  ├─model           模型目錄
│  ├─view            檢視目錄
│  ├─config.php      模組配置檔案
│  └─common.php      模組公共檔案

控制器名字命名

如果是HelloWorld這種控制名字的話,
在連線訪問的時候
需要這樣訪問
http://ken.tp5.com/index/hello_world/index

返回json格式

$data = ["name"=>"Ken","age"=>20,"sex"=>"man"];
<!-- 返回json,並修改狀態碼 -->
return json($data,201);
<!-- 返回json資料 -->
return json($data);
<!-- 返回xml -->
return xml($data);  
 <!--渲染模板  -->
$this->assign("name","莫納個");
return $this->fetch('index/index2');   

模組

模組下面有控制器模組
也有模板模組

正確跳轉到正確的頁面

$this->success("正確的頁面","index");
就會跳轉到index頁面

錯誤的跳轉頁面

function errored(){
    $this->error("錯誤頁面","index");
}

資源訪問

public
├─index.php       應用入口檔案
├─static				靜態資源目錄   
│  ├─css      樣式目錄
│  ├─js         指令碼目錄
│  └─img      影象目錄

記住,千萬不要在public目錄之外的任何位置放置資原始檔,包括application目錄。

http://tp5.com/static/css/style.css
http://tp5.com/static/js/common.js
http://tp5.com/static/img/picture.jpg

引入請求物件

https://blog.csdn.net/weixin_41452768/article/details/79679510
use think\Request;

TP5.1:request請求物件(使用四種方式獲取)

在index/controller下建立一個名為requests.php的檔案
(注意:不要起名為request,因為它是關鍵字,不被允許起名)

動態方法和靜態方法的區別:

靜態方法:public  static  function  test(){}

動態方法:;public  function  test(){}

可以看出,他們的區別就是一個是靜態方法,一個是普通方法。
use think\Request;

class Name

{

    $request = Request::instance();

    $method = $request->method();//獲取上傳方式

    $request->param();//獲取所有引數,最全

    $get = $request->get();獲取get上傳的內容

    $post = $request->post();獲取post上傳的內容

    $request->file('file')獲取檔案

}
--------------------- 
作者:weixin_41452768 
來源:CSDN 
原文:https://blog.csdn.net/weixin_41452768/article/details/79679510 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

獲取URL資訊

$request = Request::instance();
// 獲取當前域名
echo 'domain: ' . $request->domain() . '<br/>';
// 獲取當前入口檔案
echo 'file: ' . $request->baseFile() . '<br/>';
// 獲取當前URL地址 不含域名
echo 'url: ' . $request->url() . '<br/>';
// 獲取包含域名的完整URL地址
echo 'url with domain: ' . $request->url(true) . '<br/>';
// 獲取當前URL地址 不含QUERY_STRING
echo 'url without query: ' . $request->baseUrl() . '<br/>';
// 獲取URL訪問的ROOT地址
echo 'root:' . $request->root() . '<br/>';
// 獲取URL訪問的ROOT地址
echo 'root with domain: ' . $request->root(true) . '<br/>';
// 獲取URL地址中的PATH_INFO資訊
echo 'pathinfo: ' . $request->pathinfo() . '<br/>';
// 獲取URL地址中的PATH_INFO資訊 不含字尾
echo 'pathinfo: ' . $request->path() . '<br/>';
// 獲取URL地址中的字尾資訊
echo 'ext: ' . $request->ext() . '<br/>';

請求引數獲取

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']));

配置sql除錯工具箱

https://my.oschina.net/lylyg/blog/1486895
https://blog.csdn.net/qq_40657528/article/details/82596488
https://blog.csdn.net/u012600104/article/details/78833789

微信公眾號開發

https://my.oschina.net/lylyg/blog/1486895
https://blog.csdn.net/feverrun/article/details/78857834
https://www.cnblogs.com/zzcit/p/5573708.html
https://www.cnblogs.com/xp796/p/5215500.html
https://www.cnblogs.com/zsczsc/p/6577224.html

微信開發視訊教程

https://www.imooc.com/video/9304

msql預處理語句

https://blog.csdn.net/weixin_37839711/article/details/81562550

查詢資料

查詢一個數據使用:

// 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方法返回的都是陣列。

主從查詢
如果你使用了分散式資料庫,那麼預設情況下查詢操作都是在從資料庫中進行,如果你在一些特殊的情況下需要從主庫讀取資料,可以使用:

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')->insert($data);
Db::name('user')->master()->where('id',1)->find();
V5.0.19+版本開始,支援一旦某個表寫入了資料,那麼當前請求的後續查詢操作都可以自動從主庫讀取。

你需要在資料庫配置檔案中增加下面的配置引數:

// 從主庫讀取資料
'read_master'	=>	true,
如果你只需要對某個表進行操作,可以使用readMaster方法。

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')
	->readMaster()
    ->insert($data);
// 後續所有關於該資料表的查詢都會走主庫
也可以讓後續所有資料表的查詢都走主庫

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')
	->readMaster(true)
    ->insert($data);
// 後續所有資料表的查詢都會走主庫
助手函式
系統提供了一個db助手函式,可以更方便的查詢:

db('user')->where('id',1)->find();
db('user')->where('status',1)->select();
注意:使用db助手函式預設每次都會重新連線資料庫,而使用Db::name或者Db::table方法的話都是單例的。db函式如果需要採用相同的連結,可以傳入第三個引數,例如:

db('user',[],false)->where('id',1)->find();
db('user',[],false)->where('status',1)->select();
上面的方式會使用同一個資料庫連線,第二個引數為資料庫的連線引數,留空表示採用資料庫配置檔案的配置。

版本 調整功能
5.0.9 db助手函式預設不再強制重新連線
使用Query物件或閉包查詢
或者使用查詢物件進行查詢,例如:

$query = new \think\db\Query();
$query->table('think_user')->where('status',1);
Db::find($query);
Db::select($query);

或者直接使用閉包函式查詢,例如:

Db::select(function($query){
    $query->table('think_user')->where('status',1);
});

值和列查詢
查詢某個欄位的值可以用

// 返回某個欄位的值
Db::table('think_user')->where('id',1)->value('name');
value 方法查詢結果不存在,返回 null

查詢某一列的值可以用

// 返回陣列
Db::table('think_user')->where('status',1)->column('name');
// 指定索引
Db::table('think_user')->where('status',1)->column('name','id');
Db::table('think_user')->where('status',1)->column('id,name'); // 同tp3的getField
column 方法查詢結果不存在,返回空陣列

資料集分批處理
如果你需要處理成千上百條資料庫記錄,可以考慮使用chunk方法,該方法一次獲取結果集的一小塊,然後填充每一小塊資料到要處理的閉包,該方法在編寫處理大量資料庫記錄的時候非常有用。

比如,我們可以全部使用者表資料進行分批處理,每次處理 100 個使用者記錄:

Db::table('think_user')->chunk(100, function($users) {
    foreach ($users as $user) {
        //
    }
});

// 或者交給回撥方法myUserIterator處理

Db::table('think_user')->chunk(100, 'myUserIterator');
你可以通過從閉包函式中返回false來中止對資料集的處理:

Db::table('think_user')->chunk(100, function($users) {
    // 處理結果集...
    return false;
});

也支援在chunk方法之前呼叫其它的查詢方法,例如:

Db::table('think_user')->where('score','>',80)->chunk(100, function($users) {
    foreach ($users as $user) {
        //
    }
});

chunk方法的處理預設是根據主鍵查詢,支援指定欄位,例如:

Db::table('think_user')->chunk(100, function($users) {
    // 處理結果集...
    return false;
},'create_time');

V5.0.11版本開始,chunk方法支援指定處理資料的順序。

Db::table('think_user')->chunk(100, function($users) {
    // 處理結果集...
    return false;
},'create_time', 'desc');
JSON型別資料查詢(mysql V5.0.1)
// 查詢JSON型別欄位 (info欄位為json型別)
Db::table('think_user')->where('info$.email','[email protected]')->find();

新增一條資料

使用 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 方法新增資料成功返回新增資料的自增主鍵

新增多條資料

$data = [
    ['foo' => 'bar', 'bar' => 'foo'],
    ['foo' => 'bar1', 'bar' => 'foo1'],
    ['foo' => 'bar2', 'bar' => 'foo2']
];
Db::name('user')->insertAll($data);
助手函式
// 新增單條資料
db('user')->insert($data);

// 新增多條資料
db('user')->insertAll($list);
快捷更新
V5.0.5+以上版本封裝的快捷更新方法data,可以配合insert使用。

下面舉個例子說明用法:

Db::table('data')
    ->data(['name'=>'tp','score'=>1000])
    ->insert();