學習TP框架(一)
前言:
初次接觸TP5,所以只能一邊翻tp手冊,熟悉基本用法,同時在app開發後臺路上,繼續往前拱一點。不做技術半吊子(不知其所以然),從我做起!!^_^
練習程式碼:
201717/4/27
<?php
namespace app\index\controller;
use think\Controller;
use think\Request;
class Index extends Controller {
/*
* 請求資訊---獲取請求引數
* 用處:從客戶端那取引數
*/
public function requestParam () {
$request = Request::instance();
echo '請求方法:' . $request->method() . '<br/>';
echo '資源型別:' . $request->type() . '<br/>';
echo '訪問地址:' . $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']));
}
/*
* 請求資訊---獲取模組名稱、控制器名稱、獲取操作名稱
*/
public function requestController() {
$request = Request::instance();
echo "當前模組名稱是" . $request->module();
echo "當前控制器名稱是" . $request->controller();
echo "當前操作名稱是" . $request->action();
}
/*
* 請求資訊---獲取URL
*/
public function requestURL() {
$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/>';
}
/*
* 因為繼承了Controller 所以覆蓋構造方法
*/
public function _initialize() {
echo 'init<br/>';
//return 'init success!';
}
/*
* 入口檔案
*/
public function index() {
//獲取URL
$this->requestURL();
//獲取模組名 控制名 操作名
$this->requestController();
// 獲取引數
$this->requestParam();
// exit;//退出
return '張鐵牛';
// $data = ['name'=>'thinkphp','url'=>'thinkphp.cn'];
//支援明確格式的輸出
// return json(['data'=>$data,'code'=>1,'message'=>'操作完成']);
// return xml(['data'=>$data,'code'=>1,'message'=>'操作完成']);
}
/*
* 當前模組名是index
* 控制器名是 index
* 操作名(函式名)test
*/
public function test() {
//獲取模組名 控制名 操作名
$this->requestController();
return '我是張鐵牛2號';
}
/*
* 測試變態特性:設定某操作執行前必須執行的方法。也叫前置操作
*/
protected $beforeActionList = [
'first', //沒有設值,就預設在所有方法(除了_initialize)呼叫
'second' => ['except' => 'hello'],
'three' => ['only' => 'hello,data'], //只有呼叫hello data時,才呼叫three
];
protected function first() {
echo 'first<br/>';
}
protected function second() {
echo 'second<br/>';
}
protected function three() {
echo 'three<br/>';
}
public function hello() {
return 'hello';
}
public function data() {
return 'data';
}
}
小結:
- 入口檔案中不應該包含過多程式碼(就像安卓Activity中不適合寫過多的程式碼),所以應該將程式碼拆分,還index.php一個清爽的樣子。解決辦法:新增檔案(入口檔案),新建資料夾(建立模組)
- 每次測試入口檔案中的操作(成員函式)時候,必須輸入一大串URL(比如:requestURL函式 ,我需要這樣才能訪問 http://localhost/index/index/requestURL 次數多了,就頭大),有沒有偷懶(高效!)更短的URL。解決辦法:tp手冊上有個路由註冊,還有路由批量註冊,明天試試。
2017/4/28
1、url路徑太長,百度谷歌不收錄怎麼辦?(配置路由)
方法1:修改application下的route.php(路由配置檔案)。注意要把原來的程式碼註釋掉,就是下面這些程式碼。
return [
'__pattern__' => [
'name' => '\w+',
],
'[hello]' => [
':id' => ['index/hello', ['method' => 'get'], ['id' => '\d+']],
':name' => ['index/hello', ['method' => 'post']],
],
//規則:如果url以index/index開頭(不管後面有沒有name) 都把他路由到index/index/hello中進行處理
//但是 出問題了
//當我想訪問http://localhost/index/index/requestParam時,他給我路由到hello方法上了,這不是我想要的結果,怎麼辦?
//試錯1:單個配置路由
//試錯2:重新理解註冊規則
//'[:param ]'=> ['index/index/hello/name/sdf',['method' => 'get']]
];
這是我配置的路由
// 路由有什麼用?
//問題:url路徑太長,百度谷歌不收錄怎麼辦?
//解決辦法:配置URL路由(SEO優化)
//試錯1:單個配置路由
//這個方法比較好用
//但是路由定義好後,之前的url就失效了
//比如localhost/hello 可以
//對應的localhost/index/index/hello就失效
use think\Route;
Route::rule('hello', 'index/index/hello');
//Route::rule('index','index/index/index');
Route::rule('rparam','index/index/requestParam' );
Route::rule('rurl','index/index/requestURL');
Route::rule("rcontroller",'index/index/requestController');
上圖:
繼續28號的新內容:
2、url中的值是怎麼傳給php程式的?(TP5參考手冊)
//$param 這裡是預設的請求引數繫結
public function hello($param) {
//有靜態方法用,為什麼還需要建立物件來浪費記憶體呢
$request = Request::instance();
//用has方法檢測變數是否賦值
//在url只賦值必須是這樣的
// name(變數名)/11(值)
//完整URL:http://localhost/hello/people/666
//結果:flag:1 輸出:hello666
$flag = $this->request->has("people");
echo $flag;
// 著這種方法測試成功
//$param = Request::instance()->param('people');
//這種也測試成功
//$param = $this->request->param('people');
//為什麼下面這個不行
//中間的reuquest前面不能加美元符號
//所以去掉就行了
//$param = $this->request->param('people');
return 'hello'.$param;
}
3、如何操作資料庫(修改配置檔案)
tp開發官方手冊http://www.kancloud.cn/manual/thinkphp5/118060,新手按照圖片tp手冊能做對個十有八九,但還是有些小細節需要注意下。使用xmapp整合環境開始時,由於PHPMyAdamin中config.inc.php(C:\xampp\phpMyAdmin\config.inc.php)的密碼預設是空,所以使用xmapp管理資料庫時出錯時,要記得同步修改上面檔案的對應專案。這裡感謝http://blog.csdn.net/lioncode/article/details/7917310,寫的真的真的很好,學習了。
出錯圖:
4、小結:
1、沒必要建立物件時,就沒必要建立物件。有靜態方法用,為什麼還需要建立物件來浪費記憶體呢?
$request = Request::instance();
echo '請求方法:' . $request->method() . '<br/>';
//上面先是建立物件,再呼叫方法。 有靜態方法用,為什麼還需要建立物件來浪費記憶體呢
Request::instance()->method();
java中也有很多靜態方法,靜態方法的好處就是你不用再為了呼叫方法而去建立物件。
2、tp連線資料庫成功,兩個基本的查詢和寫入操作也已經測試成功,明天會繼續熟悉資料庫的CRUD操作。
3、正如tp的一句簽名【十年磨一劍-為API開發設計的高效能框架】,github上有很多基於tp寫的app後臺。明天除了學習資料庫的操作,還有熟悉tp模型的使用。
2017/4/29
1、資料庫的CRUD操作熟悉完成之後,接著進行模型的學習。也即是學著用model來操作資料表。具體如何用Model操作資料表,在tp5官方手冊已經說得很詳細了。
2、27號我說想多建設幾個模組,老在index模組裡寫程式碼不好,專案結構不夠清晰,所以我打算新建三個模組,model,controller,view。我如果要在index模組下的index類的index方法寫下面這些程式碼,執行會出錯。“致命錯誤: Class ‘StudentModel’ not found”,最後查明,是我名稱空間沒寫對。
//這塊咋測試都不成功。為甚麼, 致命錯誤: Class 'StudentModel' not found
$student2 = new \app\model\StudentModel();
$student2->name= 'di 2 ge ';
$student2->number='222';
$student2->save();
3、上面的問題解決完後,我想把index模組去掉(或者我重構Index為controller),然後執行報錯。
先上我的專案結構圖
報錯截圖:
我很疑惑,localhost沒錯,提示找不到控制器index(沒改之前index的路徑是index/index/index),我只是將index.php從原來的index模組放到了controller模組,為什麼就不行?
解決辦法1:直接用路徑localhost/controller/index/index 結果:失敗
解決辦法2:是不是哪個配置檔案沒改過來 實驗成功)
猜想1:是不是控制器不能小寫,已知大寫能成功
實驗結果:控制器名小寫會出錯,以後類名要大寫
猜想2:類名和檔名不一致能不能訪問成功?
實驗結果:類名大寫,檔名小寫(名字不一樣),失敗。
猜想3:現在的名稱空間是:namespace app\admin\controller;我去掉controller還能訪問麼?
實驗結果:不行。名稱空間必須完整,不完整會出現各種坑。上目錄結構圖
實驗3:我能不能把admin模組也去掉?
實驗結果:不能。
上圖:
猜想4:我在上一個實驗的基礎上,在controller模組中又新建一個controller,上圖
實驗結果:成功。這說明,控制器一定要放在controller下,否則tp5認不出你。
4、小結
由於之前忽視了名稱空間的作用,命名規則(開發規範),才會出現這麼多問題。明天開始看github上APP後臺。
2017/4/30
更新在學習《學習TP框架(二)》