《PHP學習:ThinkPHP控制器詳解》要點:
本文介紹了PHP學習:ThinkPHP控制器詳解,希望對您有用。如果有疑問,可以聯系我們。
相關主題:thinkphp教程
PHP實例在上一課程中,你可能會對ThinkPHP的路由會有一絲絲疑惑,不過沒關系,學完本課程,很多事都會豁然開朗.
PHP實例控制器文件命名遵守IndexController.class.php的方式
PHP實例控制器的定義
PHP實例在開始之前,我們還是必要明確一下控制器的定義:
PHP實例
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function read($id){
echo "read page with </br>" .$id;
}
public function top(){
echo "top page </br>";
}
}
PHP實例如所見,前面在路由篇提到的控制器便是這么定義的:
PHP實例使用相應的命名空間,默認是namespace Home\Controller
加載Think\Controller
新建控制器繼承于Controller(或子類)
采用駝峰命名法,注意首字母大寫
控制器內的公共辦法可以看作一個操作,比如上面的read()和top()辦法就可以看作操作,我們在路由篇的時候都驗證過了.
PHP實例http://localhost:8999/index.php/Home/Index/top
就是拜訪到top()方法,會在頁面上打印出top page ,再次明確Home代表的是Home模塊
PHP實例有時候可能會遇到有和系統的關鍵字沖突的辦法,這時候就可以使用設置操作辦法后綴來解決了,具體請看官方文檔:
http://document.thinkphp.cn/manual_3_2.html#define_controller
PHP實例前置和后置操作
PHP實例前置和后置操作指的是在執行某個操作方法之前和之后會自動調用的方法,不過僅對拜訪控制器有效,如在IndexController中為top()方法添加前置后置方法:
PHP實例
public function _before_top(){
echo "before top page </br>";
}
public function top(){
echo "top page </br>";
}
public function _after_top(){
echo "after top page </br>";
}
PHP實例拜訪:http://localhost:8999/index.php/Home/Index/top
PHP實例就會看到打印出:
PHP實例
before top page
top page
after top page
PHP實例使用前置和后置操作要注意如下兩點:
PHP實例如果當前的操作并沒有定義操作辦法,而是直接渲染模板文件,那么如果定義了前置和后置辦法的話,依然會生效.真正有模板輸出的可能僅僅是當前的操作,前置和后置操作一般情況是沒有任何輸出的.
PHP實例需要注意的是,在有些辦法里面使用了exit或者錯誤輸出之類的話 有可能不會再執行后置辦法了.例如,如果在當前操作里面調用了系統Action的error辦法,那么將不會再執行后置操作,但是不影響success辦法的后置辦法執行
PHP實例可以用于表單的過濾和驗證
PHP實例參數綁定
PHP實例參數綁定是通過直接綁定URL地址中的變量作為操作辦法的參數,可以簡化辦法的定義甚至路由的解析.
PHP實例
'URL_PARAMS_BIND' => true
PHP實例
參數綁定功能默認是開啟的,其原理是把URL中的參數(不包括模塊、控制器和操作名)和操作方法中的參數進行綁定.
參數綁定有兩種方式:依照變量名綁定和依照變量順序綁定,默認使用的是依照變量名綁定,比如看下面的例子:
PHP實例
public function read($id){
echo "read page with </br>".$id;
}
public function archive($year, $month){
echo "$year </br>".$month;
}
PHP實例對,這個便是上一篇路由所涉及的內容,在之前路由的路由設置處
PHP實例'blogs/:id'?????????????? => array('Index/read')
我們將:id直接映射給read()方法的參數$id,所以現在回頭再看,其實路由規則就是給了你一個自定義URL的功能.如果去掉上面的路由設置,我們正確的拜訪方式是:
PHP實例http://localhost:8999/Home/index/read/id/3
PHP實例上面的URl中id便是變量名,如果你寫成:
PHP實例
public function read($title){
echo "read page with </br>".$title;
}
PHP實例那么拜訪地址就是:
PHP實例http://localhost:8999/index.php/Home/index/read/title/3
PHP實例對于多個參數綁定的情況,只要將相應的變量名和值傳進來就可以了,不在乎順序,好比下面兩個會返回相同的結果:
PHP實例http://localhost:8999/index.php/Home/index/archive/year/2012/month/12
PHP實例http://localhost:8999/index.php/Home/index/archive/month/12/year/2012
PHP實例需要注意的是,不管那種情況之下,當你拜訪
PHP實例http://localhost:8999/index.php/Home/index/read/
是會報錯的:
PHP實例參數錯誤或者未定義:id
解決的一個好辦法就是,給綁定的參數設置默認值,比如:
PHP實例
public function read($id=0){
echo "read page with </br>".$id;
}
PHP實例這樣再次拜訪上面的URL,就會輸出:
PHP實例read page with
0
PHP實例tips:給綁定參數設置默認值是一個避免報錯的好方法
在實際的開發中,我們其實會見到沒有顯示變量名這樣的URL,如:
PHP實例http://localhost:8999/index.php/Home/index/read/3
PHP實例怎么解決呢?這個時候,我們其實就可以用到第二種參數綁定:依照變量順序綁定.要使用這種參數綁定,需要先在設置項中設置:
PHP實例
'URL_PARAMS_BIND_TYPE' => 1
PHP實例一旦設置變量順序綁定,這種情況下URL地址中的參數順序非常重要,不能隨意調整.這種情況下操作方法的定義不需要改變,只是訪問的URL變了罷了,現在用上面的方式訪問就可以正確訪問了.
PHP實例如果在變量順序綁定的情況下,我們拜訪:
PHP實例http://localhost:8999/index.php/Home/index/archive/2012/12
PHP實例http://localhost:8999/index.php/Home/index/archive/12/2012
PHP實例這兩個結果顯然是不一樣,后者并不是我們想要的.所以這種情況必要嚴格遵守順序來傳值.
PHP實例偽靜態
PHP實例URL偽靜態通常是為了滿足更好的SEO效果,ThinkPHP支持偽靜態URL設置,可以通過設置URL_HTML_SUFFIX參數隨意在URL的最后增加你想要的靜態后綴,而不會影響當前操作的正常執行,默認情況下,偽靜態的設置為html.但我們可以本身設置,例如
PHP實例'URL_HTML_SUFFIX'=>'shtml'
PHP實例如果希望支持多個偽靜態后綴,可以直接設置如下:
PHP實例'URL_HTML_SUFFIX' => 'html|shtml|xml'
PHP實例如果此項設置留空則表示可以支持所有的靜態后綴.
PHP實例也可以設置禁止拜訪的URL后綴通過URL_DENY_SUFFIX來設置,例如:
PHP實例'URL_DENY_SUFFIX' => 'pdf|ico|png|gif|jpg',
注: URL_DENY_SUFFIX的優先級比URL_HTML_SUFFIX要高.
PHP實例URL生成
PHP實例為了配合所使用的URL模式,我們需要能夠動態的根據當前的URL設置生成對應的URL地址,為此,ThinkPHP內置提供了U辦法,用于URL的動態生成,可以確保項目在移植過程中不受環境的影響.
PHP實例定義規則
PHP實例U辦法的定義規則如下(方括號內參數根據實際應用決定):
U('地址表達式',['參數'],['偽靜態后綴'],['顯示域名'])
PHP實例地址表達式
PHP實例地址表達式的格式定義如下:
PHP實例[模塊/控制器/操作#錨點@域名]?參數1=值1&參數2=值2...
如果不定義模塊的話 就表示當前模塊名稱,下面是一些簡單的例子:
PHP實例U('User/add') // 生成User控制器的add操作的URL地址
U('Article/read?id=1') // 生成Article控制器的read操作 并且id為1的URL地址
U('Admin/User/select') // 生成Admin模塊的User控制器的select操作的URL地址
PHP實例參數
PHP實例U辦法的第二個參數支持數組和字符串兩種定義方式,如果只是字符串方式的參數可以在第一個參數中定義,例如:
PHP實例
U('Article/cate',array('cate_id'=>1,'status'=>1))
U('Article/cate','cate_id=1&status=1')
U('Article/cate?cate_id=1&status=1')
PHP實例三種方式是等效的,都是生成Article控制器的cate()操作 并且cate_id為1 status為1的URL地址
PHP實例但是不允許使用下面的定義方式來傳參數:
PHP實例
U('Article/cate/cate_id/1/status/1');
PHP實例生成路由地址
PHP實例U辦法還可以支持路由,如果我們定義了一個路由規則為:
PHP實例
'blogs/:id\d'=>'Index/read'
PHP實例那么可以使用
PHP實例
U('/blogs/1');
PHP實例最畢生成的URL地址是:
PHP實例http://localhost:8999/index.php/Home/blogs/1
PHP實例跳轉和重定向
PHP實例這應該是在開發中最常用的功能之一.在應用開發中,經常會遇到一些帶有提示信息的跳轉頁面,例如操作成功或者操作錯誤頁面,并且自動跳轉到另外一個目標頁面.系統的\Think\Controller類內置了兩個跳轉辦法success()和error(),用于頁面跳轉提示.
PHP實例跳轉
PHP實例使用辦法很簡單,比如我們在Index控制器下新建一個辦法user(),寫上下面的內容:
PHP實例
public function user()
{
$User = M('User');
$data['username'] = 'Think';
$data['email'] = 'Think@gmail.com';
$result = $User->add($data);
if($result){
$this->success('success', '/Home/User/addUser');
} else {
$this->error('failed');
}
}
PHP實例M('User')表示實例化一個User對象,add()辦法是向數據庫添加一條紀錄.然后我們需要新建一個UserController,在里面寫上addUser()辦法
PHP實例
<?php
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller {
public function addUser()
{
echo 'add user done!';
}
}
PHP實例然后在瀏覽器中拜訪http://localhost:8999/Home/Index/user,就可以看到add user done!了,下面詳細來說說這兩個重定向方法.
PHP實例success()和error()辦法的第一個參數表示提示信息,第二個參數表示跳轉地址,第三個參數是跳轉時間(單位為秒),例如:
PHP實例
// redirect to /Article/index after 3 seconds when success
$this->success('done','/Home/Article/index',3);
// redirect to /Article/error after 5 seconds when failed
$this->error('failed','/Home/Article/error',5);
PHP實例如果不設置跳轉時間,默認的等待時間success()辦法是1秒,error()辦法是3秒.看到上面的兩個跳轉地址前面都帶上了/Home,如果你想簡寫為/Article/index,你需要在ThinkPHP的入口文件(項目目錄下的index.php)中加上下面一行:
PHP實例
define('BIND_MODULE','Home');
PHP實例而且這兩個辦法都有對應的模板,默認的設置是兩個辦法對應的模板都是:
PHP實例'TMPL_ACTION_ERROR' => THINK_PATH . 'Tpl/dispatch_jump.tpl',
PHP實例'TMPL_ACTION_SUCCESS' => THINK_PATH . 'Tpl/dispatch_jump.tpl',
你可以根據本身的需要來修改模版.
PHP實例重定向
PHP實例Controller類的redirect()辦法可以實現頁面的重定向功能.
redirect()辦法的參數用法和U函數的用法一致(參考上一部分URL生成部分),例如:
PHP實例$this->redirect('/Home/Article/show', array('id' => 2), 3, 'Redirecting...');
上面的用法是停留3秒后跳轉到Article控制器的show()操作,并且顯示頁面跳轉中字樣Redirecting...,重定向后會改變當前的URL地址.
PHP實例為了成功進行測試,我們在IndexController下添加redirectToArticle()辦法并寫上上面那行代碼:
PHP實例
public function redirectToArticle()
{
$this->redirect('/Home/Article/show', array('id' => 2), 3, 'Redirecting...');
}
PHP實例然后我們創建一個ArticleController,并且為他添加show()辦法:
PHP實例
namespace Home\Controller;
use Think\Controller;
class ArticleController extends Controller {
public function show($id)
{
echo 'This is an Article Page';
// $id 變量我們后續會用到,現在只是演示跳轉
}
}
PHP實例然后在瀏覽器拜訪:http://localhost:8999/Home/Index/redirectToArticle,等待三秒,你就可以看到跳轉之后的頁面了.
PHP實例如果你僅僅是想重定向要一個指定的URL地址,而不是到某個模塊的操作辦法,可以直接使用redirect()函數重定向,例如
PHP實例$this->redirect('/Home/Article/show/id/3', 'Redirecting...',3);
PHP實例注:控制器的redirect()辦法和redirect()函數的區別在于前者是用URL規則定義跳轉地址,后者是一個純粹的URL地址
注:好像官方文檔是這樣寫的
PHP實例$this->redirect('/New/category/cate_id/2', 5, '頁面跳轉中...');
PHP實例以上所述便是本文的全部內容了,希望大家能夠喜歡.
《PHP學習:ThinkPHP控制器詳解》是否對您有啟發,歡迎查看更多與《PHP學習:ThinkPHP控制器詳解》相關教程,學精學透。維易PHP學院為您提供精彩教程。