1. 程式人生 > >學習TP框架(一)

學習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'; } }

小結:

  1. 入口檔案中不應該包含過多程式碼(就像安卓Activity中不適合寫過多的程式碼),所以應該將程式碼拆分,還index.php一個清爽的樣子。解決辦法:新增檔案(入口檔案),新建資料夾(建立模組)
  2. 每次測試入口檔案中的操作(成員函式)時候,必須輸入一大串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框架(二)》