Controller 控制器虛類
?? Controller 為抽象類,無法通過 new 方式實例化,由 Bootstrap 自動實例化,Azalea 中所有控制器必須繼承此類
路由分發規則
Azalea 根據路徑分隔符進行分割,規則與 Zend Framework 和 CodeIgniter 類似,規則如下
/[folder/]controller/action/arg1/arg2/arg3...
- 當
folder
文件夾在 控制器目錄 下存在則folder
有效,并把該文件夾作為 當前控制器目錄,否則folder
為空; -
controller
會在當前控制器目錄下查找 同名 的.php
文件,加載并自動實例化,默認控制器名在配置['dispatch']['default_controller']
中設置; -
action
會在當前的 控制器實例 中查找 同名 + 環境后綴 的public
方法,默認方法名在配置['dispatch']['default_action']
中設置; -
action
后的部分組成arguments
數組 - 范例
/
[
'folder` => null,
'controller' => 'default',
'action' => 'index',
'arguments' => [],
]
/foo
[
'folder` => null,
'controller' => 'foo',
'action' => 'index',
'arguments' => [],
]
/foo/bar
[
'folder` => null,
'controller' => 'foo',
'action' => 'bar',
'arguments' => [],
]
/foo/bar/a/b/c
[
'folder` => null,
'controller' => 'foo',
'action' => 'bar',
'arguments' => ['a', 'b', 'c'],
]
控制器類和控制器方法命名規則
-
controller
類名與控制器名相同并首字母大寫,若存在folder
,則再加上文件夾名作前綴并首字母大寫,并以"Controller"
作為后綴,例如
class DefaultController extends Azalea\Controller {}
class AdminDefaultController extends Azalea\Controller {} // folder 為 "admin"
-
action
環境后綴 會根據運行環境配置,若默認"WEB"
,則后綴為"Action"
,否則直接使用環境名作為后綴,如"CLI"
、"CRON"
等,例如
public function indexAction() {} // 運行環境為 "WEB"
public function scheduleCLI() {} // 運行環境為 "CLI"
控制器方法的返回值
控制器方法支持返回 2 種類型
- 字符串:Azalea 將直接輸出,常用于視圖渲染
- 數組/對象:Azalea 將進行
json_encode
后輸出,常用于接口或 Ajax 返回
Controller::__init <small>子類實現</small>
控制器初始化回調函數
void Controller::__init ( void )
?? 該方法若子類實現則 Bootstrap 會自動調用,常用于子類初始化
參數
無返回值
無范例
protected function __init()
{
if (date('h') < 12) {
$this->title = '上午';
} else {
$this->title = '下午';
}
}
Controller::__router <small>子類實現</small>
動態路由回調函數
array Controller::__router ( array $paths )
?? 該方法若子類實現則 Bootstrap 會自動調用
參數
$paths - 路徑參數數組,第一個元素是action
控制器方法名,剩下的元素為arguments
參數數組返回值
新路由數組,若無返回或返回null
,則保留原路由
Azalea 只會對返回的路由數組中callback
,action
和arguments
進行處理,其它值將忽略
callback
和action
必須為字符串,且優先處理callback
,該值表示分發到控制器內指定的函數名范例
protected function __router($paths)
{
// 如路徑為 product/123456,123456 為商品 ID
if (is_numeric($paths[0])) {
return [
'action' => 'view', // 路由到 view
'arguments' => [$paths[0]], // 把 $paths[0] 作為路徑參數
];
} else {
return [
'callback' => 'view', // 路由到 $this->view 方法,不會加運行環境后綴
]
}
}
// 目標 Action
public function viewAction($productId) {}
// 目標方法
public function view() {}
Controller::getRequest
獲取 Request 請求類
Request Controller::getRequest ( void )
參數
無返回值
請求類實例范例
$request = $this->getRequest();
Controller::getResponse
獲取 Response 響應類
Response Controller::getResponse ( void )
參數
無返回值
響應類實例范例
$response = $this->getResponse();
Controller::getSession
獲取 Session 會話類
Session Controller::getSession ( void )
參數
無返回值
會話類實例范例
$session = $this->getSession();
Controller::getModel
獲取模塊
Model Controller::getModel ( string $name )
參數
$name - 模塊名返回值
模塊實例范例
$mysqlModel = $this->getModel('mysql');
Controller::loadModel
加載模塊文件
void Controller::loadModel ( string ...$name )
參數
$name - 模塊名,可傳入多個模塊名返回值
無范例
$this->loadModel('mysql', 'solr');
Controller::getView
獲取 View 視圖類
View Controller::getView ( void )
參數
無返回值
視圖類實例范例
$view = $this->getView();
Controller::throw404
拋出 404 異常
void Controller::throw404 ( string $message ) throws E404Exception
參數
$message - 異常信息返回值
無異常
拋出 E404Exception 異常范例
$this->throw404('找不到商品');