Azalea\Controller

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 种类型

  1. 字符串:Azalea 将直接输出,常用于视图渲染
  2. 数组/对象: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, actionarguments 进行处理,其它值将忽略
    callbackaction 必须为字符串,且优先处理 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('找不到商品');

你可能感兴趣的:(Azalea\Controller)