欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ThinkPHP控制器詳解

 更新時(shí)間:2015年07月27日 11:23:10   投稿:hebedich  
一般來(lái)說(shuō),ThinkPHP的控制器是一個(gè)類(lèi),而操作則是控制器類(lèi)的一個(gè)公共方法。下面我們就來(lái)詳細(xì)談?wù)凾hinkPHP的控制器

在上一課程中,你可能會(huì)對(duì)ThinkPHP的路由會(huì)有一絲絲疑惑,不過(guò)沒(méi)關(guān)系,學(xué)完本課程,很多事都會(huì)豁然開(kāi)朗。

控制器文件命名遵守IndexController.class.php的方式

控制器的定義

在開(kāi)始之前,我們還是需要明確一下控制器的定義:

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

}

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

使用相應(yīng)的命名空間,默認(rèn)是namespace Home\Controller
加載Think\Controller
新建控制器繼承于Controller(或子類(lèi))
采用駝峰命名法,注意首字母大寫(xiě)
控制器內(nèi)的公共方法可以看作一個(gè)操作,比如上面的read()和top()方法就可以看作操作,我們?cè)诼酚善臅r(shí)候都驗(yàn)證過(guò)了。

http://localhost:8999/index.php/Home/Index/top
就是訪問(wèn)到top()方法,會(huì)在頁(yè)面上打印出top page ,再次明確Home代表的是Home模塊

有時(shí)候可能會(huì)遇到有和系統(tǒng)的關(guān)鍵字沖突的方法,這時(shí)候就可以使用設(shè)置操作方法后綴來(lái)解決了,具體請(qǐng)看官方文檔:
http://document.thinkphp.cn/manual_3_2.html#define_controller

前置和后置操作

前置和后置操作指的是在執(zhí)行某個(gè)操作方法之前和之后會(huì)自動(dòng)調(diào)用的方法,不過(guò)僅對(duì)訪問(wèn)控制器有效,如在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>";
  }

訪問(wèn):http://localhost:8999/index.php/Home/Index/top

就會(huì)看到打印出:

before top page
top page
after top page

使用前置和后置操作要注意如下兩點(diǎn):

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

需要注意的是,在有些方法里面使用了exit或者錯(cuò)誤輸出之類(lèi)的話 有可能不會(huì)再執(zhí)行后置方法了。例如,如果在當(dāng)前操作里面調(diào)用了系統(tǒng)Action的error方法,那么將不會(huì)再執(zhí)行后置操作,但是不影響success方法的后置方法執(zhí)行

可以用于表單的過(guò)濾和驗(yàn)證

參數(shù)綁定

參數(shù)綁定是通過(guò)直接綁定URL地址中的變量作為操作方法的參數(shù),可以簡(jiǎn)化方法的定義甚至路由的解析。

'URL_PARAMS_BIND'    => true


參數(shù)綁定功能默認(rèn)是開(kāi)啟的,其原理是把URL中的參數(shù)(不包括模塊、控制器和操作名)和操作方法中的參數(shù)進(jìn)行綁定。
參數(shù)綁定有兩種方式:按照變量名綁定和按照變量順序綁定,默認(rèn)使用的是按照變量名綁定,比如看下面的例子:

 public function read($id){
    echo "read page with </br>".$id;
  }

 public function archive($year, $month){
    echo "$year </br>".$month;
  }

對(duì),這個(gè)就是上一篇路由所涉及的內(nèi)容,在之前路由的路由設(shè)置處

'blogs/:id'               => array('Index/read')
我們將:id直接映射給read()方法的參數(shù)$id,所以現(xiàn)在回頭再看,其實(shí)路由規(guī)則就是給了你一個(gè)自定義URL的功能。如果去掉上面的路由設(shè)置,我們正確的訪問(wèn)方式是:

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

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

 public function read($title){
    echo "read page with </br>".$title;
  }



那么訪問(wèn)地址就是:

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

對(duì)于多個(gè)參數(shù)綁定的情況,只要將相應(yīng)的變量名和值傳進(jìn)來(lái)就可以了,不在乎順序,比如下面兩個(gè)會(huì)返回相同的結(jié)果:

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

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

需要注意的是,不管那種情況之下,當(dāng)你訪問(wèn)

http://localhost:8999/index.php/Home/index/read/
是會(huì)報(bào)錯(cuò)的:

參數(shù)錯(cuò)誤或者未定義:id
解決的一個(gè)好方法就是,給綁定的參數(shù)設(shè)置默認(rèn)值,比如:

 public function read($id=0){
    echo "read page with </br>".$id;
  }

這樣再次訪問(wèn)上面的URL,就會(huì)輸出:

read page with
0

tips:給綁定參數(shù)設(shè)置默認(rèn)值是一個(gè)避免報(bào)錯(cuò)的好辦法
在實(shí)際的開(kāi)發(fā)中,我們其實(shí)會(huì)見(jiàn)到?jīng)]有顯示變量名這樣的URL,如:

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

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

'URL_PARAMS_BIND_TYPE' => 1

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

如果在變量順序綁定的情況下,我們?cè)L問(wèn):

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

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

這兩個(gè)結(jié)果顯然是不一樣,后者并不是我們想要的。所以這種情況需要嚴(yán)格遵守順序來(lái)傳值。

偽靜態(tài)

URL偽靜態(tài)通常是為了滿足更好的SEO效果,ThinkPHP支持偽靜態(tài)URL設(shè)置,可以通過(guò)設(shè)置URL_HTML_SUFFIX參數(shù)隨意在URL的最后增加你想要的靜態(tài)后綴,而不會(huì)影響當(dāng)前操作的正常執(zhí)行,默認(rèn)情況下,偽靜態(tài)的設(shè)置為html。但我們可以自己設(shè)置,例如

'URL_HTML_SUFFIX'=>'shtml'

如果希望支持多個(gè)偽靜態(tài)后綴,可以直接設(shè)置如下:

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

如果此項(xiàng)設(shè)置留空則表示可以支持所有的靜態(tài)后綴。

也可以設(shè)置禁止訪問(wèn)的URL后綴通過(guò)URL_DENY_SUFFIX來(lái)設(shè)置,例如:

'URL_DENY_SUFFIX' => 'pdf|ico|png|gif|jpg',
注: URL_DENY_SUFFIX的優(yōu)先級(jí)比URL_HTML_SUFFIX要高。

URL生成

為了配合所使用的URL模式,我們需要能夠動(dòng)態(tài)的根據(jù)當(dāng)前的URL設(shè)置生成對(duì)應(yīng)的URL地址,為此,ThinkPHP內(nèi)置提供了U方法,用于URL的動(dòng)態(tài)生成,可以確保項(xiàng)目在移植過(guò)程中不受環(huán)境的影響。

定義規(guī)則

U方法的定義規(guī)則如下(方括號(hào)內(nèi)參數(shù)根據(jù)實(shí)際應(yīng)用決定):
U('地址表達(dá)式',['參數(shù)'],['偽靜態(tài)后綴'],['顯示域名'])

地址表達(dá)式

地址表達(dá)式的格式定義如下:

[模塊/控制器/操作#錨點(diǎn)@域名]?參數(shù)1=值1&參數(shù)2=值2...
如果不定義模塊的話 就表示當(dāng)前模塊名稱(chēng),下面是一些簡(jiǎn)單的例子:

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

參數(shù)

U方法的第二個(gè)參數(shù)支持?jǐn)?shù)組和字符串兩種定義方式,如果只是字符串方式的參數(shù)可以在第一個(gè)參數(shù)中定義,例如:

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地址

但是不允許使用下面的定義方式來(lái)傳參數(shù):

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

生成路由地址

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

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

那么可以使用

U('/blogs/1');

最終生成的URL地址是:

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

跳轉(zhuǎn)和重定向

這應(yīng)該是在開(kāi)發(fā)中最常用的功能之一。在應(yīng)用開(kāi)發(fā)中,經(jīng)常會(huì)遇到一些帶有提示信息的跳轉(zhuǎn)頁(yè)面,例如操作成功或者操作錯(cuò)誤頁(yè)面,并且自動(dòng)跳轉(zhuǎn)到另外一個(gè)目標(biāo)頁(yè)面。系統(tǒng)的\Think\Controller類(lèi)內(nèi)置了兩個(gè)跳轉(zhuǎn)方法success()和error(),用于頁(yè)面跳轉(zhuǎn)提示。

跳轉(zhuǎn)

使用方法很簡(jiǎn)單,比如我們?cè)贗ndex控制器下新建一個(gè)方法user(),寫(xiě)上下面的內(nèi)容:

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')表示實(shí)例化一個(gè)User對(duì)象,add()方法是向數(shù)據(jù)庫(kù)添加一條紀(jì)錄。然后我們需要新建一個(gè)UserController,在里面寫(xiě)上addUser()方法

<?php
namespace Home\Controller;

use Think\Controller;

class UserController extends Controller {

  public function addUser()
  {
    echo 'add user done!';
  }
}

然后在瀏覽器中訪問(wèn)http://localhost:8999/Home/Index/user,就可以看到add user done!了,下面詳細(xì)來(lái)說(shuō)說(shuō)這兩個(gè)重定向方法。

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

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

如果不設(shè)置跳轉(zhuǎn)時(shí)間,默認(rèn)的等待時(shí)間success()方法是1秒,error()方法是3秒。看到上面的兩個(gè)跳轉(zhuǎn)地址前面都帶上了/Home,如果你想簡(jiǎn)寫(xiě)為/Article/index,你需要在ThinkPHP的入口文件(項(xiàng)目目錄下的index.php)中加上下面一行:

define('BIND_MODULE','Home');

而且這兩個(gè)方法都有對(duì)應(yīng)的模板,默認(rèn)的設(shè)置是兩個(gè)方法對(duì)應(yīng)的模板都是:

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

'TMPL_ACTION_SUCCESS' => THINK_PATH . 'Tpl/dispatch_jump.tpl',
你可以根據(jù)自己的需要來(lái)修改模版。

重定向

Controller類(lèi)的redirect()方法可以實(shí)現(xiàn)頁(yè)面的重定向功能。
redirect()方法的參數(shù)用法和U函數(shù)的用法一致(參考上一部分URL生成部分),例如:

$this->redirect('/Home/Article/show', array('id' => 2), 3, 'Redirecting...');
上面的用法是停留3秒后跳轉(zhuǎn)到Article控制器的show()操作,并且顯示頁(yè)面跳轉(zhuǎn)中字樣Redirecting...,重定向后會(huì)改變當(dāng)前的URL地址。

為了成功進(jìn)行測(cè)試,我們?cè)贗ndexController下添加redirectToArticle()方法并寫(xiě)上上面那行代碼:

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

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

namespace Home\Controller;

use Think\Controller;

class ArticleController extends Controller {

  public function show($id)
  {
    echo 'This is an Article Page';
    // $id 變量我們后續(xù)會(huì)用到,現(xiàn)在只是演示跳轉(zhuǎn)
  }
}

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

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

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

注:控制器的redirect()方法和redirect()函數(shù)的區(qū)別在于前者是用URL規(guī)則定義跳轉(zhuǎn)地址,后者是一個(gè)純粹的URL地址
注:好像官方文檔是這樣寫(xiě)的

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

以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。

相關(guān)文章

  • PHP面向?qū)ο笕筇攸c(diǎn)學(xué)習(xí)(充分理解抽象、封裝、繼承、多態(tài))

    PHP面向?qū)ο笕筇攸c(diǎn)學(xué)習(xí)(充分理解抽象、封裝、繼承、多態(tài))

    PHP面向?qū)ο笕筇攸c(diǎn)學(xué)習(xí) 學(xué)習(xí)目標(biāo):充分理解抽象、封裝、繼承、多態(tài)
    2012-05-05
  • php中yii框架實(shí)例用法

    php中yii框架實(shí)例用法

    在本篇內(nèi)容里小編給大家整理了一篇關(guān)于php中yii框架實(shí)例用法及相關(guān)知識(shí)點(diǎn),有需要的朋友們可以學(xué)習(xí)下。
    2020-12-12
  • PHP壓縮html網(wǎng)頁(yè)代碼(清除空格,換行符,制表符,注釋標(biāo)記)

    PHP壓縮html網(wǎng)頁(yè)代碼(清除空格,換行符,制表符,注釋標(biāo)記)

    如果提高網(wǎng)頁(yè)加載速度,需要怎么優(yōu)化是一個(gè)問(wèn)題,yahoo曾經(jīng)搞了一個(gè)優(yōu)化36條。其實(shí)網(wǎng)頁(yè)優(yōu)化的方法還是很多很多的。下面扯一下關(guān)于減小頁(yè)面體積來(lái)提高前端加載速度的方法
    2012-04-04
  • php通過(guò)exif_read_data函數(shù)獲取圖片的exif信息

    php通過(guò)exif_read_data函數(shù)獲取圖片的exif信息

    這篇文章主要介紹了php通過(guò)exif_read_data函數(shù)獲取圖片的exif信息,默認(rèn)情況下,PHP讀取圖片Exif信息模塊是不開(kāi)啟的,我們需要先開(kāi)啟這個(gè)模塊。開(kāi)啟Exif模塊需要mbstring支持,這里就不詳細(xì)說(shuō)明了,我們來(lái)先看下函數(shù)的用法
    2015-05-05
  • PHP中命令行工具的使用詳解

    PHP中命令行工具的使用詳解

    在PHP中,你可以使用命令行工具執(zhí)行一些任務(wù),比如運(yùn)行腳本、執(zhí)行定時(shí)任務(wù)等,本文主要為大家詳細(xì)介紹了PHP中使用命令行工具的幾種方法,希望對(duì)大家有所幫助
    2023-12-12
  • php中rename函數(shù)用法分析

    php中rename函數(shù)用法分析

    這篇文章主要介紹了php中rename()函數(shù)用法,較為詳細(xì)的分析了rename()函數(shù)中參數(shù)的含義及具體的使用方法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-11-11
  • PHP中in_array函數(shù)使用的問(wèn)題與解決辦法

    PHP中in_array函數(shù)使用的問(wèn)題與解決辦法

    相信大家都知道in_array函數(shù)是判斷數(shù)據(jù)中是否存在指定的內(nèi)容了,對(duì)于這個(gè)函數(shù)用法非常的簡(jiǎn)單,但在使用過(guò)程中會(huì)我發(fā)現(xiàn)有一些問(wèn)題,下面我們就對(duì)于這些問(wèn)題來(lái)看看如何處理吧.有需要的朋友們可以參考借鑒。
    2016-09-09
  • 一個(gè)PHP的QRcode類(lèi)與大家分享

    一個(gè)PHP的QRcode類(lèi)與大家分享

    一個(gè)PHP的QRcode類(lèi)與大家分享,需要的朋友可以參考下。
    2011-11-11
  • PHP IDE PHPStorm配置支持友好Laravel代碼提示方法

    PHP IDE PHPStorm配置支持友好Laravel代碼提示方法

    這篇文章主要介紹了PHP IDE PHPStorm配置支持友好Laravel代碼提示方法,重點(diǎn)配置已經(jīng)加紅提示,需要的朋友可以參考下
    2015-05-05
  • PHP大文件及斷點(diǎn)續(xù)傳下載實(shí)現(xiàn)代碼

    PHP大文件及斷點(diǎn)續(xù)傳下載實(shí)現(xiàn)代碼

    這篇文章主要介紹了PHP大文件及斷點(diǎn)續(xù)傳下載實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論