訪問控制器

ThinkPHP引入了分層控制器的概念,通過URL訪問的控制器為訪問控制器層(Controller)或者主控制器,訪問控制器是由\think\App類負責調用和實例(li)化的,無需手動實例(li)化。

URL解析和路由后,會把當前的URL地址解析到 [ 模塊/控制器/操(cao)作(zuo) ],其實也就是(shi)執行(xing)某(mou)個(ge)(ge)控制器類的某(mou)個(ge)(ge)操作方法,下(xia)面(mian)是(shi)一(yi)個(ge)(ge)示例(li):

namespace app\index\controller;

class Blog 
{
    public function index()
    {
        return 'index';
    }
    
    public function add()
    {
        return 'add';
    }
    
    public function edit($id)
    {
        return 'edit:'.$id;
    }
}

當前定義的(de)(de)主控制器位于index模塊下(xia)面(mian),所以當訪問不同(tong)的(de)(de)URL地址的(de)(de)頁面(mian)輸出如下(xia):

http://serverName/index/blog/index // 輸出 index
http://serverName/index/blog/add     // 輸出 add
http://serverName/index/blog/edit/id/5 // 輸出 edit:5

新版(ban)的(de)控(kong)制(zhi)器可以(yi)不需要繼承任何基(ji)類(lei),當(dang)然,你可以(yi)定義(yi)一個公(gong)共的(de)控(kong)制(zhi)器基(ji)礎類(lei)來(lai)被繼承,也可以(yi)通過控(kong)制(zhi)器擴展來(lai)完(wan)成不同的(de)功能(例如Restful實現)。

如果(guo)不經(jing)過路由訪問的(de)話,URL中的(de)控(kong)制(zhi)器名(ming)會首(shou)先(xian)強制(zhi)轉(zhuan)為小寫,然后再解析為駝峰(feng)法實例化該(gai)控(kong)制(zhi)器。

分層控制器

除了訪問控制(zhi)(zhi)器(qi)外,我們還可以定義(yi)其他分層(ceng)控制(zhi)(zhi)器(qi)類,這些分層(ceng)控制(zhi)(zhi)器(qi)是(shi)不(bu)能夠(gou)被URL訪問直接(jie)調用到的,只能在訪問控制(zhi)(zhi)器(qi)、模型類的內部(bu),或(huo)者視圖模板文(wen)件中進行(xing)調用。

例(li)如(ru),我們(men)定義Blog事件控制器如(ru)下(xia):

namespace app\index\event;

class Blog 
{
    public function insert()
    {
        return 'insert';
    }
    
    public function update($id)
    {
        return 'update:'.$id;
    }
    
    public function delete($id)
    {
        return 'delete:'.$id;
    }
}

定義完成(cheng)后,就可以用下面的方(fang)式實例(li)化并調用方(fang)法了:

$event = \think\Loader::controller('Blog', 'event');
echo $event->update(5); // 輸出 update:5
echo $event->delete(5); // 輸(shu)出 delete:5

為了方便(bian)調用,系統提供(gong)了controller助手函數(shu)直接實例化多(duo)層(ceng)控制器(qi),例如:

$event = controller('Blog', 'event');
echo $event->update(5); // 輸(shu)出 update:5
echo $event->delete(5); // 輸出 delete:5

支持跨(kua)模塊調用,例(li)如:

$event = controller('Admin/Blog', 'event');
echo $event->update(5); // 輸出 update:5

表示實例化Admin模塊的Blog控制(zhi)器類,并執行(xing)update方法。

除了實例(li)化(hua)分層控制(zhi)器(qi)外,還可以直接(jie)調(diao)用分層控制(zhi)器(qi)類的某個方(fang)法,例(li)如:

echo \think\Loader::action('Blog/update', ['id' => 5], 'event'); // 輸出 update:5

也可以使用助手函數action實現相同的功能:

echo action('Blog/update', ['id' => 5], 'event'); // 輸出(chu) update:5

利用分層控制器的機制,我們可以用來實現Widget(其實就是在模板中調用分層控制器),例如:
定義index\widget\Blog控制器類如下:

namespace app\index\widget;

class Blog {
    public function header()
    {
        return 'header';
    }
    
    public function left()
    {
        return 'left';
    }
    
    public function menu($name)
    {
        return 'menu:'.$name;
    }
}

我們在模板文件中就可以直接調用app\index\widget\Blog分層控制器了,
使用助手函數action

{:action('Blog/header', '', 'widget')}
{:action('Blog/menu', ['name' => 'think'], 'widget')}

框架還提供了widget函數用于簡化Widget控制器的調用,
可以直接使用助手函數widget

{:widget('Blog/header')}
{:widget('Blog/menu', ['name' => 'think'])}