Thinkphp 控制器/控制器定義
控制器定義
控制器和操作
一般來說,ThinkPHP的控制器是一個類,而操作則是控制器類的一個公共方法。
下面就是一個典型的控制器類的定義:
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function hello(){
echo 'hello,thinkphp!';
}
}
Home\IndexController
類就代表了Home模組下的Index控制器,而hello操作就是Home\IndexController
當訪問 http://serverName/index.php/Home/Index/hello
後會輸出:
hello,thinkphp!
注意:如果你設定了操作方法繫結到類,則操作方法對應了一個類(參考操作繫結到類)。
定義控制器
控制器通常需要繼承系統的Controller類或者其子類,例如,下面定義了一個 \Home\Controller\IndexController
控制器類:
<?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function hello(){ echo 'hello'; } public function test(){ echo 'test'; } }
控制器的名稱採用駝峰法命名(首字母大寫),控制器檔案位於 Home/Controller/IndexController.class.php
。
IndexController控制器類的hello和test方法就是操作方法,訪問下面的URL地址:
http://serverName/Home/Index/hello
http://serverName/Home/Index/test
會分別輸出:
hello
// 和
test
操作方法的定義必須是公共方法,否則會報操作錯誤,所以,下面的操作定義只能訪問hello操作,而不能訪問test操作。
<?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function hello(){ echo 'hello'; } protected function test(){ echo 'test'; } }
注意:定義控制器方法的時候,儘量避免和系統的保留方法相沖突(除非你非常明確自己在做什麼
),這些保留方法名包括但不限於:
display
get
show
fetch
theme
assign
error
success
因為操作方法就是控制器的一個方法,所以遇到有和系統的關鍵字衝突的方法可能就不能定義了,這個時候我們可以設定操作方法的字尾來解決,例如:
'ACTION_SUFFIX' => 'Action', // 操作方法字尾
設定操作方法的字尾為Action,這樣,控制器的操作方法定義調整為:
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function listAction(){
echo 'list';
}
public function helloAction(){
echo 'hello';
}
public function testAction(){
echo 'test';
}
}
操作方法的字尾設定只是影響控制器類的定義,對URL訪問沒有影響。
多層控制器
ThinkPHP的控制器支援多層和多級,多層指的是控制器可以分層,例如除了預設的Controller控制器層(我們可以稱之為訪問控制器),還可以新增事件控制器(層),例如:
├─Controller 訪問控制器
│ ├─UserController.class.php
│ ├─BlogController.class.php
│ ...
├─Event 事件控制器
│ ├─UserEvent.class.php
│ ├─BlogEvent.class.php
│ ...
訪問控制器的名稱是通過DEFAULT_C_LAYER設定的,預設是Controller。
訪問控制器負責外部互動響應,通過URL請求響應,例如 http://serverName/Home/User/index
,而事件控制器負責內部的事件響應,並且只能在內部呼叫,所以是和外部隔離的。
多層控制器的劃分可以根據專案的需要自由分層。
如果是定義其他的控制器層,則不一定必須要繼承系統的Controller類或其子類,通常需要輸出模版的時候才需要繼承Controller類。例如:
<?php
namespace Home\Event;
class UserEvent {
public function login(){
echo 'login event';
}
public function logout(){
echo 'logout event';
}
}
UserEvent事件控制器位於 Home/Event/UserEvent.class.php
。
多級控制器
多級控制器是指控制器可以通過子目錄把某個控制器層分組存放,首先需要設定控制器的分級層次,例如,我們設定2級目錄的控制器層:
'CONTROLLER_LEVEL' => 2,
控制器檔案的位置放置如下:
├─Controller 訪問控制器
│ ├─User User分級(組)
│ │ ├─UserTypeController.class.php
│ │ ├─UserAuthController.class.php
│ ...
│ ├─Admin Admin分級(組)
│ │ ├─UserController.class.php
│ │ ├─ConfigController.class.php
│ ...
多級控制器中的名稱空間需要這樣定義:
<?php
namespace Home\Controller\Admin;
use Think\Controller;
class IndexController extends Controller {
public function hello(){
echo 'hello';
}
public function test(){
echo 'test';
}
}
然後就可以通過URL地址訪問:
http://serverName/Home/User/UserType
http://serverName/Home/Admin/User
如果希望簡化URL地址中的模組地址,可以參考 模組部署
例項化控制器
訪問控制器的例項化通常是自動完成的,系統會根據URL地址解析出訪問的控制器名稱自動例項化,並且呼叫相關的操作方法。
如果你需要跨控制器呼叫的話,則可以單獨例項化:
// 例項化Home模組的User控制器
$User = new \Home\Controller\UserController();
// 例項化Admin模組的Blog控制器
$Blog = new \Admin\Controller\BlogController();
系統為上面的控制器例項化提供了一個快捷呼叫方法A,上面的程式碼可以簡化為:
// 假設當前模組是Home模組
$User = A('User');
$Blog = A('Admin/Blog');
預設情況下,A方法例項化的是預設控制器層(Controller),如果你要例項化其他的分層控制器的話,可以使用:
// 假設當前模組是Home模組
// 例項化Event控制器
$User = A('User','Event');
$Blog = A('Admin/Blog','Event');
上面的程式碼等效於:
// 例項化Home模組的User事件控制器
$User = new \Home\Event\UserEvent();
// 例項化Admin模組的Blog事件控制器
$Blog = new \Admin\Event\BlogEvent();