訪問控制器

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

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

namespace app\index\controller;

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

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

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

新版的控制(zhi)器(qi)可以不需(xu)要繼承任何基類,當然,你可以定義一(yi)個(ge)公共的控制(zhi)器(qi)基礎類來被(bei)繼承,也可以通過(guo)控制(zhi)器(qi)擴(kuo)展來完成不同(tong)的功能(例(li)如Restful實現)。

如果不經(jing)過路由訪問的話,URL中(zhong)的控制器(qi)名會首先強制轉為小寫(xie),然后再(zai)解析(xi)為駝峰法實例化該控制器(qi)。

分層控制器

除了訪(fang)問(wen)控(kong)制(zhi)器外(wai),我(wo)們還可以定義其他分(fen)層控(kong)制(zhi)器類,這些(xie)分(fen)層控(kong)制(zhi)器是不能夠被URL訪(fang)問(wen)直接調用到的(de),只能在訪(fang)問(wen)控(kong)制(zhi)器、模型類的(de)內部,或(huo)者(zhe)視圖模板文件中進(jin)行調用。

例如,我們(men)定義Blog事件(jian)控制器如下(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)后(hou),就(jiu)可以(yi)用下面的方式實例(li)化(hua)并調用方法了(le):

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

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

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

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

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

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

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

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