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 子类实现
控制器初始化回调函数
void Controller::__init ( void )
⚠️ 该方法若子类实现则 Bootstrap 会自动调用,常用于子类初始化
参数
无返回值
无范例
protected function __init()
{
if (date('h') < 12) {
$this->title = '上午';
} else {
$this->title = '下午';
}
}
Controller::__router 子类实现
动态路由回调函数
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('找不到商品');