Azalea\Controller

Controller 控制器虚类

⚠️ Controller 为抽象类,无法通过 new 方式实例化,由 Bootstrap 自动实例化,Azalea 中所有控制器必须继承此类

路由分发规则


Azalea 根据路径分隔符进行分割,规则与 Zend FrameworkCodeIgniter 类似,规则如下

/[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 <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, 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('找不到商品');
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,389评论 0 17
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,946评论 6 13
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,620评论 18 399
  • 早春的一个下午,在太阳快下山时拍摄的。是一株不知道名字的花,细细的枝上只剩下一片枯叶,用了仰视,逆光来拍摄。...
    茶叶蛋的Cha阅读 347评论 0 2