tp5和tp3.2的區別
萬變不離其宗,tp5和tp3.2雖說是差別很大,但是套路大家都懂得。只要我們瞭解了他們的區別,再去學tp5,豈不是如魚得水。
好,那我們來了解一下tp5和tp3.2的區別。
1,入口檔案的繫結
我們都知道thinkphp是一個單入口框架,它所有的請求都通過public/index.php進入,如果我們正常情況下,我們預設訪問的是index模組下的Index控制器下的index方法,如果我們現在想訪問index.php或者是我們在這個地方再新建一個其它的檔案,我們能不能將這個檔案,直接繫結到某個模組?
我們在入口檔案(public/index.php)中新增如下程式碼(注意順序一定是這樣的),他就會通過index.php,自動訪問home模組
// 定義應用目錄
define('APP_PATH', __DIR__ . '/../application/');
// 繫結到index模組
define('BIND_MODULE','home');
// 載入框架引導檔案
require __DIR__ . '/../thinkphp/start.php';
如果我的網站開發給第三方,那麼我肯定不期望第三方訪問我的index模組和admin模組,這樣我們只需要在index.php入口檔案的同級建一個api.php,然後在api.php中繫結api模組,這樣我們訪問public/api.php直接訪問api模組,別的模組訪問不了。
此外,在thinkphp/convention.php中有一個 ‘auto_bind_module’,我們把它改成true,開啟了入口檔案自動繫結,也可以實現同樣的操作
2.URL和路由的變化
thinkphp/convention.php找到url_route_on和url_route_must,是配置路由是否開啟和是否強制使用路由。
我們使用預設配置,然後找到public/route.php檔案
return [
'test/:id' => 'index/test'
];
配置好路由,就可以通過指定路由訪問。
3.請求物件Request和響應物件Response
5.0新增了請求物件Request和響應物件Response,Request統一處理請求和獲取請求資訊,Response物件負責輸出客戶端或者瀏覽器響應。
tp5中我們有三種方法可以讓我們獲得Request物件
1,框架提供的一個助手函式request()
2,是通過think下的Request類來獲取它的例項
3,直接注入Request物件
具體獲取引數方法如下:
<?php
namespace api\index\controller;
use think\Request;
class Index
{
public function index(Request $request)
{
# 獲取瀏覽器輸入框的值
dump($request->domain());
dump($request->pathinfo());
dump($request->path());
# 請求型別
dump($request->method());
dump($request->isGet());
dump($request->isPost());
dump($request->isAjax());
# 請求的引數
dump($request->get());
dump($request->param());
dump($request->post());
//session('name', 'onestopweb');
//cookie('email', '[email protected]');
//session(null);
//cookie('email',null);
dump($request->session());
dump($request->cookie());
dump($request->param('type'));
dump($request->cookie('email'));
# 獲取模組 控制器 操作
dump($request->module());
dump($request->controller());
dump($request->action());
# 獲取URL
dump($request->url());
dump($request->baseUrl());
}
}
4,資料庫操作
tp5.0
助手函式廢除了單字母函式,改用助手函式
M->db
呼叫資料表:
M('User')->where(['name'=>'thinkphp'])->find();(3.2)
db('User')->where('name'=>'thinkphp')->find();(5.0)
D->model
例項化模型的使用:
D('User')->where(['name'=>'thinkphp'])->find();
model('User')->where(['name'=>'thinkphp'])->find();
//或者
$UserModel =new User();
$UserModel->where(['name'=>'thinkphp'])->find();
U->url
IS_Get->Request::instance()->isGet();
IS_POST->Request::instance()->isPost();
I->input(代替)
5,在控制器中正確的輸出模板
如果你繼承think\Controller
的話,可以使用:
return $this->fetch('index/hello');
如果你的控制器沒有繼承 think\Controller
的話,使用:
return view('index/hello');
6.常量
5.0版本廢棄了原來的大部分常量定義,僅僅保留了框架的路徑常量定義,其餘的常量可以使用App類或者Request類的相關屬性或者方法來完成,或者自己重新定義需要的常量。
廢除的常量包括:
REQUEST_METHOD、IS_GET IS_POST、IS_PUT、IS_DELETE、IS_AJAX __EXT__、COMMON_MODULE 、MODULE_NAME、CONTROLLER_NAME、ACTION_NAME、APP_NAMESPACE、APP_DEBUG、MODULE_PATH
當然一些常用的常量可以自己定義,如定義路徑常量
在application/config.php,或者在模組下新建一個config.php。
return [
'view_replace_str' =>[
'__HOME__' => '/static/home',
]
];
我們還是可以方便的引入和替換一些css,js 檔案
7.模板繼承
模板繼承是一項更加靈活的模板佈局方式,模板繼承不同於模板佈局,甚至來說,應該在模板佈局的上層。模板繼承其實並不難理解,就好比類的繼承一樣,模板也可以定義一個基礎模板(或者是佈局),並且其中定義相關的區塊(block),然後繼承(extend)該基礎模板的子模板中就可以對基礎模板中定義的區塊進行過載。
因此,模板繼承的優勢其實是設計基礎模板中的區塊(block)和子模板中替換這些區塊。
每個區塊由{block} {/block}
標籤組成。 下面就是基礎模板中的一個典型的區塊設計(用於設計網站標題):
{block name="title"}<title>網站標題</title>{/block}
block標籤必須指定name屬性來標識當前區塊的名稱,這個標識在當前模板中應該是唯一的,block標籤中可以包含任何模板內容,包括其他標籤和變數,例如:
{block name="title"}<title>{$web_title}</title>{/block}
你甚至還可以在區塊中載入外部檔案:
{block name="include"}{include file="Public:header" /}{/block}
一個模板中可以定義任意多個名稱標識不重複的區塊,例如下面定義了一個base.html
基礎模板:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>{block name="title"}標題{/block}</title>
</head>
<body>
{block name="menu"}選單{/block}
{block name="left"}左邊分欄{/block}
{block name="main"}主內容{/block}
{block name="right"}右邊分欄{/block}
{block name="footer"}底部{/block}
</body>
</html>
然後我們在子模板(其實是當前操作的入口模板)中使用繼承:
{extend name="base" /}
{block name="title"}{$title}{/block}
{block name="menu"}
<a href="/" >首頁</a>
<a href="/info/" >資訊</a>
<a href="/bbs/" >論壇</a>
{/block}
{block name="left"}{/block}
{block name="main"}
{volist name="list" id="vo"}
<a href="/new/{$vo.id}">{$vo.title}</a><br/>
{$vo.content}
{/volist}
{/block}
{block name="right"}
最新資訊:
{volist name="news" id="new"}
<a href="/new/{$new.id}">{$new.title}</a><br/>
{/volist}
{/block}
{block name="footer"}
{__block__}
@ThinkPHP 版權所有
{/block}
上例中,我們可以看到在子模板中使用了extend標籤來繼承了base模板
8,標籤
tp5.0標籤預設使用{ },3.2是< >,變數輸出使用普通標籤就足夠了,但是要完成其他的控制、迴圈和判斷功能,就需要藉助模板引擎的標籤庫功能了,系統內建標籤庫的所有標籤無需引入標籤庫即可直接使用。
內建標籤包括:
標籤名 | 作用 | 包含屬性 |
---|---|---|
include | 包含外部模板檔案(閉合) | file |
load | 匯入資原始檔(閉合 包括js css import別名) | file,href,type,value,basepath |
volist | 迴圈陣列資料輸出 | name,id,offset,length,key,mod |
foreach | 陣列或物件遍歷輸出 | name,item,key |
for | For迴圈資料輸出 | name,from,to,before,step |
switch | 分支判斷輸出 | name |
case | 分支判斷輸出(必須和switch配套使用) | value,break |
default | 預設情況輸出(閉合 必須和switch配套使用) | 無 |
compare | 比較輸出(包括eq neq lt gt egt elt heq nheq等別名) | name,value,type |
range | 範圍判斷輸出(包括in notin between notbetween別名) | name,value,type |
present | 判斷是否賦值 | name |
notpresent | 判斷是否尚未賦值 | name |
empty | 判斷資料是否為空 | name |
notempty | 判斷資料是否不為空 | name |
defined | 判斷常量是否定義 | name |
notdefined | 判斷常量是否未定義 | name |
define | 常量定義(閉合) | name,value |
assign | 變數賦值(閉合) | name,value |
if | 條件判斷輸出 | condition |
elseif | 條件判斷輸出(閉合 必須和if標籤配套使用) | condition |
else | 條件不成立輸出(閉合 可用於其他標籤) | 無 |
php | 使用php程式碼 | 無 |