亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > 建站經驗 > 正文

ThinkPHP控制器詳解

2024-04-25 20:40:03
字體:
來源:轉載
供稿:網友

在上一課程中,你可能會對ThinkPHP的路由會有一絲絲疑惑,不過沒關系,學完本課程,很多事都會豁然開朗。

控制器文件命名遵守IndexController.class.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>";

}

}

如所見,前面在路由篇提到的控制器就是這么定義的:

使用相應的命名空間,默認是namespace Home/Controller

加載Think/Controller

新建控制器繼承于Controller(或子類)

采用駝峰命名法,注意首字母大寫

控制器內的公共方法可以看作一個操作,比如上面的read()和top()方法就可以看作操作,我們在路由篇的時候都驗證過了。

http://localhost:8999/index.php/Home/Index/top

就是訪問到top()方法,會在頁面上打印出top page ,再次明確Home代表的是Home模塊

有時候可能會遇到有和系統的關鍵字沖突的方法,這時候就可以使用設置操作方法后綴來解決了,具體請看官方文檔:

http://document.thinkphp.cn/manual_3_2.html#define_controller

前置和后置操作

前置和后置操作指的是在執行某個操作方法之前和之后會自動調用的方法,不過僅對訪問控制器有效,如在IndexController中為top()方法添加前置后置方法:

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>";

}

訪問:http://localhost:8999/index.php/Home/Index/top

就會看到打印出:

before top page

top page

after top page

使用前置和后置操作要注意如下兩點:

如果當前的操作并沒有定義操作方法,而是直接渲染模板文件,那么如果定義了前置和后置方法的話,依然會生效。真正有模板輸出的可能僅僅是當前的操作,前置和后置操作一般情況是沒有任何輸出的。

需要注意的是,在有些方法里面使用了exit或者錯誤輸出之類的話 有可能不會再執行后置方法了。例如,如果在當前操作里面調用了系統Action的error方法,那么將不會再執行后置操作,但是不影響success方法的后置方法執行

可以用于表單的過濾和驗證

參數綁定

參數綁定是通過直接綁定URL地址中的變量作為操作方法的參數,可以簡化方法的定義甚至路由的解析。

'URL_PARAMS_BIND' => true

參數綁定功能默認是開啟的,其原理是把URL中的參數(不包括模塊、控制器和操作名)和操作方法中的參數進行綁定。

參數綁定有兩種方式:按照變量名綁定和按照變量順序綁定,默認使用的是按照變量名綁定,比如看下面的例子:

public function read($id){

echo "read page with </br>".$id;

}

public function archive($year, $month){

echo "$year </br>".$month;

}

對,這個就是上一篇路由所涉及的內容,在之前路由的路由設置處

'blogs/:id' => array('Index/read')

我們將:id直接映射給read()方法的參數$id,所以現在回頭再看,其實路由規則就是給了你一個自定義URL的功能。如果去掉上面的路由設置,我們正確的訪問方式是:

http://localhost:8999/Home/index/read/id/3

上面的URl中id就是變量名,如果你寫成:

public function read($title){

echo "read page with </br>".$title;

}

那么訪問地址就是:

http://localhost:8999/index.php/Home/index/read/title/3

對于多個參數綁定的情況,只要將相應的變量名和值傳進來就可以了,不在乎順序,比如下面兩個會返回相同的結果:

http://localhost:8999/index.php/Home/index/archive/year/2012/month/12

http://localhost:8999/index.php/Home/index/archive/month/12/year/2012

需要注意的是,不管那種情況之下,當你訪問

http://localhost:8999/index.php/Home/index/read/

是會報錯的:

參數錯誤或者未定義:id

解決的一個好方法就是,給綁定的參數設置默認值,比如:

public function read($id=0){

echo "read page with </br>".$id;

}

這樣再次訪問上面的URL,就會輸出:

read page with

0

tips:給綁定參數設置默認值是一個避免報錯的好辦法

在實際的開發中,我們其實會見到沒有顯示變量名這樣的URL,如:

http://localhost:8999/index.php/Home/index/read/3

怎么解決呢?這個時候,我們其實就可以用到第二種參數綁定:按照變量順序綁定。要使用這種參數綁定,需要先在設置項中設置:

'URL_PARAMS_BIND_TYPE' => 1

一旦設置變量順序綁定,這種情況下URL地址中的參數順序非常重要,不能隨意調整。這種情況下操作方法的定義不需要改變,只是訪問的URL變了而已,現在用上面的方式訪問就可以正確訪問了。

如果在變量順序綁定的情況下,我們訪問:

http://localhost:8999/index.php/Home/index/archive/2012/12

http://localhost:8999/index.php/Home/index/archive/12/2012

這兩個結果顯然是不一樣,后者并不是我們想要的。所以這種情況需要嚴格遵守順序來傳值。

偽靜態

URL偽靜態通常是為了滿足更好的SEO效果,ThinkPHP支持偽靜態URL設置,可以通過設置URL_HTML_SUFFIX參數隨意在URL的最后增加你想要的靜態后綴,而不會影響當前操作的正常執行,默認情況下,偽靜態的設置為html。但我們可以自己設置,例如

'URL_HTML_SUFFIX'=>'shtml'

如果希望支持多個偽靜態后綴,可以直接設置如下:

'URL_HTML_SUFFIX' => 'html|shtml|xml'

如果此項設置留空則表示可以支持所有的靜態后綴。

也可以設置禁止訪問的URL后綴通過URL_DENY_SUFFIX來設置,例如:

'URL_DENY_SUFFIX' => 'pdf|ico|png|gif|jpg',

注: URL_DENY_SUFFIX的優先級比URL_HTML_SUFFIX要高。

URL生成

為了配合所使用的URL模式,我們需要能夠動態的根據當前的URL設置生成對應的URL地址,為此,ThinkPHP內置提供了U方法,用于URL的動態生成,可以確保項目在移植過程中不受環境的影響。

定義規則

U方法的定義規則如下(方括號內參數根據實際應用決定):

U('地址表達式',['參數'],['偽靜態后綴'],['顯示域名'])

地址表達式

地址表達式的格式定義如下:

[模塊/控制器/操作#錨點@域名]?參數1=值1&參數2=值2...

如果不定義模塊的話 就表示當前模塊名稱,下面是一些簡單的例子:

U('User/add') // 生成User控制器的add操作的URL地址

U('Article/read?id=1') // 生成Article控制器的read操作 并且id為1的URL地址

U('Admin/User/select') // 生成Admin模塊的User控制器的select操作的URL地址

參數

U方法的第二個參數支持數組和字符串兩種定義方式,如果只是字符串方式的參數可以在第一個參數中定義,例如:

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')

三種方式是等效的,都是生成Article控制器的cate()操作 并且cate_id為1 status為1的URL地址

但是不允許使用下面的定義方式來傳參數:

U('Article/cate/cate_id/1/status/1');

生成路由地址

U方法還可以支持路由,如果我們定義了一個路由規則為:

'blogs/:id/d'=>'Index/read'

那么可以使用

U('/blogs/1');

最終生成的URL地址是:

http://localhost:8999/index.php/Home/blogs/1

跳轉和重定向

這應該是在開發中最常用的功能之一。在應用開發中,經常會遇到一些帶有提示信息的跳轉頁面,例如操作成功或者操作錯誤頁面,并且自動跳轉到另外一個目標頁面。系統的/Think/Controller類內置了兩個跳轉方法success()和error(),用于頁面跳轉提示。

跳轉

使用方法很簡單,比如我們在Index控制器下新建一個方法user(),寫上下面的內容:

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');

}

}

M('User')表示實例化一個User對象,add()方法是向數據庫添加一條紀錄。然后我們需要新建一個UserController,在里面寫上addUser()方法

<?php

namespace Home/Controller;

use Think/Controller;

class UserController extends Controller {

public function addUser()

{

echo 'add user done!';

}

}

然后在瀏覽器中訪問http://localhost:8999/Home/Index/user,就可以看到add user done!了,下面詳細來說說這兩個重定向方法。

success()和error()方法的第一個參數表示提示信息,第二個參數表示跳轉地址,第三個參數是跳轉時間(單位為秒),例如:

// 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);

如果不設置跳轉時間,默認的等待時間success()方法是1秒,error()方法是3秒??吹缴厦娴膬蓚€跳轉地址前面都帶上了/Home,如果你想簡寫為/Article/index,你需要在ThinkPHP的入口文件(項目目錄下的index.php)中加上下面一行:

define('BIND_MODULE','Home');

而且這兩個方法都有對應的模板,默認的設置是兩個方法對應的模板都是:

'TMPL_ACTION_ERROR' => THINK_PATH . 'Tpl/dispatch_jump.tpl',

'TMPL_ACTION_SUCCESS' => THINK_PATH . 'Tpl/dispatch_jump.tpl',

你可以根據自己的需要來修改模版。

重定向

Controller類的redirect()方法可以實現頁面的重定向功能。

redirect()方法的參數用法和U函數的用法一致(參考上一部分URL生成部分),例如:

$this->redirect('/Home/Article/show', array('id' => 2), 3, 'Redirecting...');

上面的用法是停留3秒后跳轉到Article控制器的show()操作,并且顯示頁面跳轉中字樣Redirecting...,重定向后會改變當前的URL地址。

為了成功進行測試,我們在IndexController下添加redirectToArticle()方法并寫上上面那行代碼:

public function redirectToArticle()

{

$this->redirect('/Home/Article/show', array('id' => 2), 3, 'Redirecting...');

}

然后我們創建一個ArticleController,并且為他添加show()方法:

namespace Home/Controller;

use Think/Controller;

class ArticleController extends Controller {

public function show($id)

{

echo 'This is an Article Page';

// $id 變量我們后續會用到,現在只是演示跳轉

}

}

然后在瀏覽器訪問:http://localhost:8999/Home/Index/redirectToArticle,等待三秒,你就可以看到跳轉之后的頁面了。

如果你僅僅是想重定向要一個指定的URL地址,而不是到某個模塊的操作方法,可以直接使用redirect()函數重定向,例如

$this->redirect('/Home/Article/show/id/3', 'Redirecting...',3);

注:控制器的redirect()方法和redirect()函數的區別在于前者是用URL規則定義跳轉地址,后者是一個純粹的URL地址

注:好像官方文檔是這樣寫的

$this->redirect('/New/category/cate_id/2', 5, '頁面跳轉中...');

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品久久久久电影| 日韩欧美精品在线观看| 久久久久久久亚洲精品| 色综合91久久精品中文字幕| 日韩中文综合网| 亚洲乱码国产乱码精品精| 欧美大秀在线观看| 久久精品亚洲一区| 1769国产精品| 日韩av在线一区| 热久久这里只有精品| 精品国产乱码久久久久久天美| 亚洲日本aⅴ片在线观看香蕉| 亚洲精品美女久久久| 成人日韩av在线| 国产成人精品久久二区二区| 久久五月情影视| 孩xxxx性bbbb欧美| 国产精彩精品视频| 亚洲欧洲日产国码av系列天堂| 欧美成人一二三| 成人亚洲综合色就1024| 激情懂色av一区av二区av| 欧美日韩在线影院| 亚洲欧美日韩一区二区在线| 欧美日韩激情小视频| 国产精品美女久久久免费| 精品久久久久久亚洲国产300| 欧美第一淫aaasss性| 欧美激情视频播放| 亚洲a一级视频| 欧美成人sm免费视频| 91精品国产91久久| 久久久国产精品视频| 国产欧美精品一区二区| 国产日韩欧美在线观看| 久久久精品视频在线观看| 久久免费视频这里只有精品| 日韩成人av在线| 国产91在线播放九色快色| 福利一区视频在线观看| 亚洲第一福利视频| 亚洲综合在线中文字幕| 夜夜嗨av一区二区三区免费区| 久久久久久91香蕉国产| 欧美性极品xxxx做受| 亚洲网站视频福利| 欧美成人精品在线视频| 中文字幕成人在线| 欧美日韩在线观看视频小说| 九九热在线精品视频| 深夜福利日韩在线看| 中文字幕精品久久久久| 亚洲自拍高清视频网站| 久久久久久久久久久亚洲| 日韩中文字幕视频在线观看| 欧美风情在线观看| 国产精品一区二区三| 国产精品日韩在线播放| 亚洲国产天堂久久国产91| 成人羞羞国产免费| 欧美区在线播放| 欧美日韩美女在线观看| 欧美激情视频播放| 亚洲性69xxxbbb| 亚洲男人av在线| 成人免费高清完整版在线观看| 国a精品视频大全| 亚洲成av人片在线观看香蕉| 久久视频国产精品免费视频在线| 国产成人综合一区二区三区| 欧美激情精品久久久久久久变态| 这里只有精品在线观看| 欧美久久精品一级黑人c片| 国产精品视频不卡| 午夜精品久久久久久久久久久久| 成人网页在线免费观看| 成人97在线观看视频| 精品香蕉一区二区三区| 九九热精品视频国产| 亚洲97在线观看| 成人福利视频在线观看| 91精品国产电影| 中文字幕无线精品亚洲乱码一区| 精品亚洲永久免费精品| 久久久久免费精品国产| 性色av香蕉一区二区| 亚洲精品在线看| 国产精品偷伦视频免费观看国产| 日本欧美国产在线| 91在线视频免费| 国产免费一区二区三区在线观看| 亚洲第一级黄色片| 国产福利视频一区二区| 亚洲精品有码在线| 欧美特级www| 欧美精品国产精品日韩精品| 91天堂在线观看| 国产不卡一区二区在线播放| 久久九九热免费视频| 亚洲欧洲日产国产网站| 成人网址在线观看| 欧美国产中文字幕| 亚洲第一页中文字幕| 日韩欧美在线看| 久久久久久久久久av| 亚洲精品国产福利| 国产精品永久免费观看| 亚洲精品国精品久久99热| 欧美黑人又粗大| 亚洲欧美日韩国产中文| 国产一区二区三区视频在线观看| 国产成人精品免高潮在线观看| 中文字幕av一区二区| 中文字幕日韩高清| 国产一区二区三区在线看| 国产美女精品视频| 色婷婷综合成人av| 777精品视频| 亚洲石原莉奈一区二区在线观看| 97久久精品人人澡人人爽缅北| 欧美视频中文字幕在线| 2019中文在线观看| 91网站免费观看| 精品二区三区线观看| 欧美成人午夜激情| 亚洲国产欧美自拍| 色www亚洲国产张柏芝| 亚洲美女精品成人在线视频| 久久久亚洲国产天美传媒修理工| 久久伊人精品视频| 国产精品视频99| 97高清免费视频| 青青久久av北条麻妃海外网| 欧美黄色www| 欧美激情视频一区| 久久精品国产亚洲| 欧美日韩国产在线| 欧美区二区三区| 美女扒开尿口让男人操亚洲视频网站| 成人性生交xxxxx网站| 亚洲三级免费看| 欧美专区中文字幕| 一区二区三区久久精品| 亚洲一区二区久久久| 国产精品自拍偷拍| 欧美噜噜久久久xxx| 欧美日韩爱爱视频| 伊人伊成久久人综合网站| 在线日韩av观看| 欧美日韩亚洲视频| 7777精品视频| 国产不卡在线观看| 亚洲国产精品久久久久久| 欧美大片在线看| 久久久最新网址| 日韩欧美国产成人| 91久久精品国产| 亚洲理论电影网| 一区二区三区在线播放欧美| 97精品在线观看| 欧美激情精品久久久久久黑人| 51精品在线观看| 欧美理论片在线观看|