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


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

  URL  模塊(控制器)  動作(方法)

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

  1、ThinkPHP規定,兩點

    ·第一、所有的主入口文件默認訪問index控制器(模塊)

    ·第二、所有的控制器默認執行index方法(動作)

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

  那么,http://127.0.0.1/projectName/index.php(即使沒有指定模塊和動作)會執行index控制器中index方法,就理所當然咯!

  2、(自定義)控制器命名規范

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

  

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

  

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

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

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

  

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

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

二、URL的四種模式

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

  1、普通模式

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

  2、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模式的格式!然后這一點在我的環境中沒有測試出來,額...

  3、REWRITE模式

  重寫模式,與偽靜態有關

  可以自己寫相關的rewrite規則,也可以直接使用ThinkPHP提供的rewrite規則,如果使用ThinkPHP提供的rewrite規則,則為

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

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

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

    

    ·第二、在入口文件平級的目錄創建一個.htaccess文件,然后將如下內容copy到.htaccess文件中保存即可!至於為啥要叫.htaccess這個名字,因為Apache規定的!下面還補充了一點如何在Windows下創建一個.xxx格式 名稱的文件

    

       

  REWRITE模式下,PATHINFO模式的URL也是可以識別的,但是如果沒有開啟REWRITE模式,REWRITE模式的URL是不能識別的!

  有興趣的可以參閱Apache手冊中的URL重寫指南部分進一步了解URL重寫

  4、兼容模式

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

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

三、PATHINFO的兩種模式

  PATHINFO本身也有兩種模式,分別為普通模式智能模式(智能識別模塊和動作)

  1、普通模式

  必須指明模塊和動作,即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

四、模板與控制器之間的關系

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

  

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

  

  

  

  

  

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

  1、有了上述三點,再來具體說說$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))!

  2、$this->assign()

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

  這里提一下修改模板標簽定界符,ThinkPHP自帶模板引擎的定界符默認是{},而默認定界符是會和模板中js代碼及內聯css沖突的,所以通常在實際開發中,都會修改模板標簽的定界符,修改應用配置文件如下

  

  3、模板調用大小寫問題

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

  

  

  

  

  

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

  其實在測試過程中,還發現了一個問題,即加載模塊執行動作的操作並不區分大小寫,因為如果是加載模塊或執行動作出錯,報的是如下錯誤

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM