ThinkPHP教程_PHP框架之ThinkPHP(二)【URL路徑訪問與模塊控制器、URL四種模式、PATHINFO的兩種模式、模板與控制器之間的關係】

1、URL路徑訪問與模塊控制器php

  URL  模塊(控制器)  動做(方法)css

  即以上三者之間的關係URL:http://127.0.0.1/projectName/index.php/模塊/動做html

  一、ThinkPHP規定,兩點web

    ·第1、全部的主入口文件默認訪問index控制器(模塊)安全

    ·第2、全部的控制器默認執行index方法(動做)服務器

  特別強調一下,以上兩點是獨立的!也就是說"全部的主入口文件默認訪問index控制器,並執行默認執行index方法"是不許確的函數

  那麼,http://127.0.0.1/projectName/index.php(即便沒有指定模塊和動做)會執行index控制器中index方法,就理所固然咯!測試

  二、(自定義)控制器命名規範this

  舉個例子,用戶管理控制器(模塊)  UserAction.class.php  模塊名稱Action.class.php,且模塊名稱首字母必需要大寫搜索引擎

  

  上面是文件名命名規範,同時還要注意類名要與文件名一致,即UserAction.class.php其中的類名稱必須是UserAction。同時注意這個類必須繼承Action類

  

  三、只有模塊中的public方法才能被訪問,protected和private方法都是不能被訪問的

  顯然這比較好理解,由於本質上在入口文件中是有$userAction=new UserAction;$userAction->方法名();這兩條語句的

  那麼,在控制器中定義一個private方法有和意義呢?結果是頗有必要的,由於對於一個模塊中的一個動做,可能因爲某一個動做比較複雜,須要執行的代碼比較多,或者某一個動做安全性要求比較高,那麼就須要將一部分代碼或安全性比較高的代碼寫到本模塊的另一個private方法中,而後在該動做(方法)內調用,這樣的話,能夠簡化代碼,使得代碼看起來更有條理,同時還比較安全!

  

  還有一種情形就是在一個模塊中,可能有一段代碼是各個動做(控制器)公用的,那麼也能夠這段公用的代碼封裝到一個private方法中,而後供模塊內其它動做調用!可能有人要問了,既然是公用的,那麼爲啥不寫到項目目錄->Common目錄中的一個函數文件中去呢,對於此,我的理解是項目目錄->Common目錄中的函數是全部模塊公用的,而這裏是一個模塊中的各個動做公用的,點到爲止咯!

  四、ps,在實際項目開發過程當中,最好將(自定義)控制器(或模型)的各個名稱映射成中文(或英文)寫入到一個文檔中,同時說明這些控制器(或模型)中都有哪些方法,且這些方法的做用,既便於他人閱讀也便於本身回顧!

2、URL的四種模式

  ThinkPHP支持的URL模式包括普通模式PATHINFO模式REWRITE模式兼容模式,都提供路由支持。默認爲PATHINFO模式,提供最友好的用戶體驗(即方便人看)和搜索引擎友好支持(SEO,即方便搜索引擎查)!分別標號爲0、一、二、3,可在項目目錄->Conf目錄->Config.php文件中進行修改

  一、普通模式

  http://127.0.0.1/projectName/index.php?m=moduleName&a=actionName&id=1

  二、PATHINFO模式

  http://127.0.0.1/projectName/index.php/moduleName/actionName/id/1

  注意,在PATHINFO模式下GET傳值就不能用普通模式的&id=1的這種格式了,即http://127.0.0.1/projectName/index.php/moduleName/actionName&id=1,由於若是這樣寫,系統會誤認爲actionName&id=1總體是一個動做名稱!

  在默認的PATHINFO模式下,若是URL是按照普通模式書寫的,那麼也會自動變成PATHINFO模式的格式!而後這一點在個人環境中沒有測試出來,額...

  三、REWRITE模式

  重寫模式,與僞靜態有關

  能夠本身寫相關的rewrite規則,也能夠直接使用ThinkPHP提供的rewrite規則,若是使用ThinkPHP提供的rewrite規則,則爲

  http://127.0.0.1/projectName/moduleName/actionName/id/1

  注意,要想開啓REWRITE模式以前,得先作兩個操做

    ·第1、開啓web服務器的rewrite模塊,拿Apache爲例,在Apache主目錄->conf目錄-httpd.conf文件中將以下圖所示語句前的#去掉。IIS、Nginx自行參考文檔哈

    

    ·第2、在入口文件平級的目錄建立一個.htaccess文件,而後將以下內容copy到.htaccess文件中保存便可!至於爲啥要叫.htaccess這個名字,由於Apache規定的!下面還補充了一點如何在Windows下建立一個.xxx格式 名稱的文件

    

       

  REWRITE模式下,PATHINFO模式的URL也是能夠識別的,可是若是沒有開啓REWRITE模式,REWRITE模式的URL是不能識別的!

  有興趣的能夠參閱Apache手冊中的URL重寫指南部分進一步瞭解URL重寫

  四、兼容模式

  http://127.0.0.1/index.php?s=/moduleName/actionName/id/1

  當服務器不支持PATHINFO模式時,若是整個項目的全部URL又都是採用的PATHINFO模式進行書寫的,那麼就會出現路徑不存在的錯誤!這是顯然的嘛,服務器壓根就不認識你的URL,怎麼搞對不對?然而從新把項目中全部的URL都改爲普通模式又太過繁瑣,因此ThinkPHP設計者就設計了兼容模式,也就是說項目中開起了兼容模式(config.php中配置爲3),即便服務器不支持PATHINFO模式,也能識別PATHINFO模式的URL!

3、PATHINFO的兩種模式

  PATHINFO自己也有兩種模式,分別爲普通模式智能模式(智能識別模塊和動做)

  一、普通模式

  必須指明模塊和動做,即http://127.0.0.1/projectName/index.php/m/moduleName/a/actionName/id/1。並且既然指明瞭模塊和動做,那麼動做和模塊的順序是能夠顛倒的

    ·設置

    一樣是在項目目錄->Conf目錄->config.php中進行設置,"URL_PATHINFO_MODEL"=>1

  二、智能模式

  沒必要指明模塊和動做,默認模式,在【2、URL的四種模式】中就是按照智能模式來的!所謂智能識別模塊和動做,就是將URL中緊跟在入口文件的第一個參數做爲moduleName,第二個參數做爲actionName,顯然,此時動做和模塊的順序就不能顛倒了

    ·設置

    一樣是在項目目錄->Conf目錄->config.php中進行設置,"URL_PATHINFO_MODEL"=>2

  注意,不論是普通模式仍是智能模式,GET傳值都必須是鍵/值這種格式,即都要指明鍵

  "URL_PATHINFO_DEPR"=>"-"設置能夠修改分隔符(默認爲/),即http://127.0.0.1/projectName/index.php/m-moduleName-a-actionName-id-1,一樣,這個設置對於普通模式和智能模式都生效

  "URL_HTML_SUFFIX"=>"html"設置能夠加上.html後綴,更好的支持SEO,即http://127.0.0.1/projectName/index.php/m-moduleName-a-actionName-id-1.html

4、模板與控制器之間的關係

  首先得知道,應用模板都必須放在應用目錄->Tpl目錄->default目錄下,注意,default目錄是在應用初始化時自動生成的,同時能夠在Tpl目錄下自定義目錄,說白了就是自定義皮膚,而default目錄就是應用默認皮膚,在自定義目錄下,固然也是能夠放模板的!

  

  其次,要在各個皮膚目錄下都要針對項目模塊創建相應的目錄,並在創建的目錄中針對模塊動做建立相應的模板

  

  

  

  

  

  最後,要知道調用模板的操做($this->display();)是發生在模塊的動做中的

  一、有了上述三點,再來具體說說$this->display();

  若是沒傳值,則調用的是默認皮膚目錄中的針對當前模塊的目錄中的針對當前動做的模板,好比說

  

  有的小夥伴可能有些疑問了,UserAction這個類中並無定義display()方法呀,怎麼能夠直接用display()呢?額,被忘了後面的extends Action呦!對,display()就是Action這個類中的一個方法!

  若是傳值,則有幾種狀況,ps,傳值的話,對於模板名,只須要寫.html後綴以前的名稱,即對應的動做名

    ·調用當前模塊的其它動做模板

    $this->display("當前模塊的其它動做名");

    ·調用其它模塊的動做模板

    $this->display("其它模塊名:動做名");其實,嚴格來講,這裏的模塊名和動做名指的其實是default皮膚目錄下的一個目錄名及其下面的一個文件名而已,並非非得要求Action目錄中有該模塊及其動做,而只須要在Tpl目錄->default皮膚目錄下有叫"其它模塊名"的目錄而且在其下有一個叫"動做名"的模板文件便可!

    ·調用其它皮膚的模板

    $this->display("皮膚名@模塊名:動做名");

    ·直接經過路徑調用模板

    $this->display("模板路徑");模板路徑既能夠是相對路徑也能夠是絕對路徑,不過要注意的是,若是是採用相對路徑,則必須是相對於入口文件

    其實,在這裏要說明的是,實際上,前三種狀況,在底層還轉化成了路徑的,而皮膚名、模塊名、動做名實際上指是目錄和文件名

  以上只說了display()方法的第一個參數,而display()方法還有兩個參數,分別是"模板編碼"(指定模板輸出編碼)、"模板格式"(指定模板輸出格式(text/html或text/xml))!

  二、$this->assign()

  $this->assign("模板變量名","值或變量");

  這裏提一下修改模板標籤訂界符,ThinkPHP自帶模板引擎的定界符默認是{},而默認定界符是會和模板中js代碼及內聯css衝突的,因此一般在實際開發中,都會修改模板標籤的定界符,修改應用配置文件以下

  

  三、模板調用大小寫問題

  開啓調試模式後,ThinkPHP就會模擬Linux下的對文件名區分大小寫,可是通過測試,發現只對文件名大小寫敏感,而對文件夾名大小寫不敏感

  

  

  

  

  

  同時,也驗證了上面的那句話,即【其實,在這裏要說明的是,實際上,前三種狀況,在底層還轉化成了路徑的,而皮膚名、模塊名、動做名實際上指是目錄和文件名

  其實在測試過程當中,還發現了一個問題,即加載模塊執行動做的操做並不區分大小寫,由於若是是加載模塊或執行動做出錯,報的是以下錯誤

  

  

相關文章
相關標籤/搜索