您好,登錄后才能下訂單哦!
小編給大家分享一下從ThinkPHP3.2.3過渡到ThinkPHP5.0的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
具體如下:
用tp3.2.3做了不少項目,但是畢竟要與時代接軌,學習一些新的框架,比如tp5
以下記錄一些學習中遇到的問題及解決辦法,還有tp3.2和tp5.0的一些區別,適合給用過tp3沒用過tp5的童鞋做個參考。
隨著學習不斷更新......
+++++++++++++++++++++++分割線總是要有的+++++++++++++++++++++++
首先到tp官網下載了一個最新的ThinkPHP5.0.22完整版:
直接扔到了服務器上,解壓后目錄結構如下:
目錄結構整體與tp3.2大同小異,文件夾首字母小寫了,應用入口文件 在根目錄下 public/index.php,官方文檔對public文件夾定義為WEB部署目錄(對外訪問目錄):
配置服務器域名解析的時候需要把項目根目錄指向/public:
<VirtualHost *:80> ServerAdmin 1977629361@qq.com DocumentRoot /var/www/tp/public ServerName tp.oyhdo.com ServerAlias tp.oyhdo.com DirectoryIndex index.php index.html index.htm </VirtualHost>
根目錄下 application/config.php 為應用(公共)配置文件,設置一些常用的配置,以下簡稱為“配置文件”:
訪問網址如下:
訪問tp.oyhdo.com等同于訪問tp.oyhdo.com/index.php/index/Index/index(默認不區分大小寫)
即默認模塊index,默認控制器Index,默認操作index
配置文件修改分別為default_module、default_controller、default_action
如果需要強制區分url大小寫,修改 url_convert 為false
:
配置文件中設置 app_debug 為true
,打開應用調試模式,以便開發調試:
【隱藏url中的index.php入口文件】
以Apache服務器為例,首先確認Apache配置文件httpd.conf中開啟了mod_rewrite.so模塊:
然后把所有【AllowOverride】設為All:
最后修改根目錄下 public/.htaccess 文件內容為:
<IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L] </IfModule>
去掉index.php也可訪問:
【隱藏前臺url模塊名】
把index模塊作為前臺,在前臺新建了一個User控制器:
<?php namespace app\index\controller; class User { public function user() { return '這是User控制器的user操作'; } }
正常需要這樣訪問User控制器的user操作:
為了前臺url顯示簡潔一些,要去掉模塊名index,然后就崩了:
如果只有一個模塊,可以在 /application/common.php 中添加:
// 綁定當前訪問到index模塊 define('BIND_MODULE','index');
親測訪問成功:
但是項目通常會有前后臺的區分,至少兩個模塊, 用上面的方法綁定index模塊后,再訪問其它模塊就會報錯:
(新建了一個admin模塊作為后臺)
<?php namespace app\admin\controller; class Index { public function index() { return '這是后臺首頁'; } }
對于多模塊的情況,可以在 /application/route.php 中綁定默認模塊路由(去掉上面的單模塊綁定):
use think\Route; Route::bind('index');
前臺訪問成功:
然后在/public/下新建一個入口文件admin.php,綁定后臺模塊admin,來訪問后臺:
<?php // [ 應用入口文件 ] namespace think; // 定義應用目錄 define('APP_PATH', __DIR__ . '/../application/'); // 加載框架引導文件 require __DIR__ . '/../thinkphp/base.php'; // 綁定當前入口文件到admin模塊 Route::bind('admin'); // 關閉admin模塊的路由 App::route(false); // 執行應用 App::run()->send();
后臺訪問成功:
(修改后臺地址只需修改這個文件名即可)
【返回數據】
配置文件中默認輸出類型 default_return_type 為html:
直接打印輸出字符串、數組,沒什么特殊:
public function index() { $str = 'hello,world!'; $arr = array('state'=>1,'msg'=>'success'); //打印字符串 echo $str; //打印數組 var_dump($arr); }
返回json格式數據:
public function index() { $arr = array('state'=>1,'msg'=>'success'); return json($arr); //返回其它狀態碼或響應頭信息 //return json($arr, 201, ['Cache-control' => 'no-cache,must-revalidate']); //xml格式 //return xml($arr); }
(對于只做API開發的情況,可以設置default_return_type為json,直接return $arr
即可返回json格式數據)
【渲染模板、分配數據】
如圖建立視圖層,index.html作為前臺首頁(內容為“這是首頁”):
tp3渲染模板直接在控制器里$this->display()
,tp5并不支持。
tp5渲染模板,在控制器中繼承think\Controller類,使用 return $this->fetch()
或者使用助手函數 return view()
:
<?php namespace app\index\controller; use think\Controller; class Index extends Controller { public function index() { return $this->fetch(); //return view(); } }
tp5分配數據的方式依舊使用 $this->assign()
:
<?php namespace app\index\controller; use think\Controller; class Index extends Controller { public function index() { $name = 'lws'; $this->assign('name',$name); return $this->fetch(); } }
index.html頁面讀取數據:
{$name}
(修改模板引擎標簽 配置文件【tpl_begin】、【tpl_end】)
【繼承父類控制器】
寫一個栗子,新建一個Base控制器作為父類控制器,Index控制器繼承Base控制器
在父類控制器中初始化分配數據,子類控制器渲染模板:
Base.php:
<?php namespace app\index\controller; use think\Controller; class Base extends Controller { //初始化方法 public function _initialize() { $haha = '快下班了'; $this->assign('haha',$haha); } }
Index.php:
<?php namespace app\index\controller; use think\Controller; class Index extends Base { public function index() { return $this->fetch(); } }
index.html:
{$haha}
(與tp3.2相比,父類控制器不能是Public控制器)
【配置參數】
tp3.2里面使用C方法設置、獲取配置參數
tp5使用助手函數 config()
設置、獲取配置參數:
//配置一個參數 config('name','lws'); //批量配置參數 config([ 'info'=>['sex'=>'nan','aihao'=>'nv'] ]); //獲取一個配置參數 echo config('name'); //獲取一組配置參數 dump(config('info')); //獲取一個二級配置參數 echo config('info.sex');
【get傳參】
tp5廢除了url/參數名1/參數值1/參數名2/參數值2......這樣的方式傳參,還是老老實實用url?參數名1=參數值1&參數名2=參數值2......這樣傳吧。
控制器里打印$_GET
:
<?php namespace app\index\controller; use think\Controller; class Index extends Controller { public function index() { $getdate = $_GET; dump($getdate); } }
這樣是不對滴:
這樣就好使:
【安全獲取變量】
tp3.2可以使用I方法安全獲取get、post等系統輸入變量
tp5中使用助手函數 input()
//獲取get變量 $data1 = input('get.name'); //獲取post變量 $data2 = input('post.name'); //獲取當前請求變量 $data3 = input('param.name'); //獲取request變量 $data4 = input('request.name'); //獲取cookie變量 $data5 = input('cookie.name'); //獲取session變量 $data6 = input('session.name'); //獲取上傳文件信息 $data7 = input('file.image');
(注意:獲取的數據為數組,要加上 /a 修飾符才能獲取到)
$arr = input('post.arr/a');
可以在配置文件中設置全局過濾方法:
// 默認全局過濾方法 用逗號分隔多個 'default_filter' => 'htmlspecialchars',
【數據庫操作】
tp5的數據庫配置文件在根目錄 /application/database.php:(也可在模塊下單獨配置)
連接數據庫:tp3.2支持M方法連接數據庫,tp5使用 Db類 或 助手函數db()
查詢數據:依舊使用 find()
、select()
方法,查詢一個字段使用 value()
方法代替getField()
//查詢一條 $artinfo = db('article')->find(); //查詢全部 $artinfo = db('article')->select(); //查詢一個字段 $artinfo = db('article')->value('article_title');
添加數據:tp3.2使用add()
,tp5使用 insert()
:返回插入條數 或 save()
:返回id
//添加一條數據 $data['article_title'] = 'PHP是世界上最好的語言'; $data['article_content'] = '如題'; db('article')->insert($data); //或 db('article')->save($data);
//添加多條數據 $data = [ ['article_title' => '標題1', 'article_content' => '內容1'], ['article_title' => '標題2', 'article_content' => '內容2'], ['article_title' => '標題3', 'article_content' => '內容3'] ]; db('article')->insertAll($data);
修改數據:tp3.2使用save()
,tp5使用 update()
//修改數據 $whe['article_id'] = 1; $data['article_title'] = '修改后的標題'; db('article')->where($whe)->update($data);
刪除數據:沒錯還是 delete()
//刪除數據 $whe['article_id'] = 1; db('article')->where($whe)->delete();
db()
助手使用起來比較方便,但每次都會重新連接數據庫,因此應當盡量避免多次調用,建議還是使用Db類操作數據庫。
Db類操作原生SQL:
<?php namespace app\index\controller; use think\Db; class Index { public function index() { // 插入記錄 $res = Db::execute('insert into lws_article (title ,content) values ("標題", "內容")'); // 刪除數據 $res = Db::execute('delete from lws_article where art_id = 1 '); // 更新記錄 $res = Db::execute('update lws_article set title = "修改標題" where art_id = 1 '); // 查詢數據 $res = Db::query('select * from lws_article where art_id = 1'); // 顯示數據庫列表 $res = Db::query('show tables from blog'); // 清空數據表 $res = Db::execute('TRUNCATE table lws_article'); } }
Db類操作查詢構造器:
<?php namespace app\index\controller; use think\Db; class Index { public function index() { // 查詢數據(數據庫沒有配置表前綴) $res = Db::table('lws_article') ->where('art_id', 1) ->select(); //以下為數據庫配置了表前綴 // 插入記錄 $res = Db::name('article') ->insert(['title' => '標題', 'content' => '內容']); // 更新記錄 $res = Db::name('article') ->where('art_id', 1) ->update(['title' => "修改標題"]); // 查詢數據 $res = Db::name('article') ->where('art_id', 1) ->select(); // 刪除數據 $res = Db::name('article') ->where('art_id', 1) ->delete(); //鏈式操作舉例 $artlist = Db::name('article') ->where('is_del', 'N') ->field('id,title,content') ->order('post_time', 'desc') ->limit(10) ->select(); } }
【切換數據庫】
首先在數據庫配置中配置多個數據庫:
// 數據庫配置1 'db1' => [ // 數據庫類型 'type' => 'mysql', // 服務器地址 'hostname' => '127.0.0.1', // 數據庫名 'database' => 'blog1', // 數據庫用戶名 'username' => 'root', // 數據庫密碼 'password' => '123456', // 數據庫連接端口 'hostport' => '', // 數據庫連接參數 'params' => [], // 數據庫編碼默認采用utf8 'charset' => 'utf8', // 數據庫表前綴 'prefix' => 'lws_', ], // 數據庫配置2 'db2' => [ // 數據庫類型 'type' => 'mysql', // 服務器地址 'hostname' => '127.0.0.1', // 數據庫名 'database' => 'blog2', // 數據庫用戶名 'username' => 'root', // 數據庫密碼 'password' => '', // 數據庫連接端口 'hostport' => '', // 數據庫連接參數 'params' => [], // 數據庫編碼默認采用utf8 'charset' => 'utf8', // 數據庫表前綴 'prefix' => 'lws_', ],
使用connect方法切換數據庫:
<?php namespace app\index\controller; use think\Db; class Index { public function index() { $db1 = Db::connect('db1'); $db2 = Db::connect('db2'); $db1->query('select * from lws_article where art_id = 1'); $db2->query('select * from lws_article where art_id = 2'); } }
【系統常量】
tp5廢除了一大堆常量:
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等
需要使用的常量可以自己定義,例如IS_GET、IS_POST
我在父類的初始化方法中定義了這兩個常量:
<?php namespace app\index\controller; use think\Controller; class Base extends Controller { public function _initialize() { define('IS_GET',request()->isGet()); define('IS_POST',request()->isPost()); } }
然后在子類控制器中就可以使用這個常量做一些判斷:
<?php namespace app\index\controller; class Index extends Base { public function index() { if(IS_POST){ echo 111; }else{ echo 222; } } }
【定義路由】
例如一篇博客詳情頁,原來的網址為:http://oyhdo.com/home/article/detial?id=50,即home模塊下的article控制器下的detial操作方法,傳遞參數id。
在路由配置文件 application/route.php 中添加路由規則:
return [ 'article/:id' => 'home/article/detial', ];
或者使用 Route 類,效果一樣:
use think\Route; Route::rule('article/:id','home/article/detial');
定義路由規則之后訪問http://oyhdo.com/article/50即可
【url分隔符的修改】
修改 application/config.php 中的 pathinfo_depr :
// pathinfo分隔符 'pathinfo_depr' => '-',
訪問網址變為:http://oyhdo.com/article-50
【跳轉、重定向】
tp3里面的正確跳轉:$this->success()
、錯誤跳轉:$this->error()
、重定向:$this->redirect()
,在tp5里面同樣適用(繼承\think\Controller)
tp5新增 redirect()
助手函數用于重定向:
return redirect('https://www.oyhdo.com');
看完了這篇文章,相信你對“從ThinkPHP3.2.3過渡到ThinkPHP5.0的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。