开发指导

更新时间:2023-03-06 15:59

在正式开发 WitFrame 应用前,请先详细阅读本章内容。WitFrame 的应用以 MVC 框架开发,因此您要先足够了解 MVC 框架的基本知识。

  • M 是指业务模型或者库文件
  • V 是指用户界面、模板或前端文件
  • C 则是控制器及业务的入口

库文件(models)

全局库

全局库位于 /framework 目录下,由于 autoload 的关系,此目录下的库文件可直接调用,如:

Common::debug($a);

远程库

远程库位于 /lib 目录下,但本库的实际函数定义均在远端,您可调用具体内容请查看“API手册”中公开的接口。您可以调用系统提供的接口,也可以调用其他应用开发者提供的接口:

Lib\Apis::Sample_v1_apis(['xxx' => 1, 'b' => [1,2]])

应用库

应用库文件存放于 /www/[app]/[ver]/models 目录下,文件名首字母大写,且类名必须为 "Model_文件名(无扩展名)",可按照“Model_xxx”格式直接调用。

应用全局库可跨版本调用,文件位于 /www/[app]/[ver]/libs 目录下,文件名首字母大写,且类名必须为 "Lib_[ver]_文件名(无扩展名)"

控制器(controllers)

控制器即应用的入口位于 /www/[app]/[ver]/controllers 目录下,文件名首字母大写,且类名必须包含文件名(无扩展名)+ "Controller"

控制器必须继承 "ApiController" 类否则线上无法运行,例如:

Index.php

class IndexController extends ApiController {
...

控制器文件名命名规范:文件名中除了首字母大写外,不能有其他大写字母和下划线

对 Controller 分层可以更好把自己应用的业务逻辑进行拆分。把 Controller 的文件放入不同的子目录中,同时类名用下划线 "_"
分隔每一层级,每层级的文件名(文件夹名)遵从同样的命名规范

见下表:

类名文件名
OneControllerOne.php
One_TwoControllerOne/Two.php
One_Two_ThreeControllerOne/Two/Three.php

应用类型

普通应用

普通 URL 入口的应用按照 xxxAction() 的命名方式添加方法。

一个控制器文件中可包含多个入口,URI 参数的顺序为 /plugin/app/ver/controller/action

如要调用 /www/Sample/v1/controllers/Index.php 的 indexAction(),可用以下 URL:

http://youwebsite/WitSdk-Dev/www/index.php/plugin/Sample/v1/index/index

indexAction() 时 action 可省略

如要调用 /www/Sample/v1/controllers/Index.php 的 showAction(),可用以下 URL:

http://youwebsite/WitSdk-Dev/www/index.php/plugin/Sample/v1/index/show

接口应用

接口应用按照 xxxInterface() 的命名方式添加方法。

一个控制器文件中可包含多个接口,被调方的接口名规则为 Lib\Apis::app_ver_controller

如要调用 /www/Sample/v1/controllers/Apis.php 的 indexInterface(),可用以下方式调用:

Lib\Apis::Sample_v1_apis(...)

indexInterface() 时 action 可省略

如要调用 /www/Sample/v1/controllers/Apis.php 的 getInterface(),可用以下方式调用:

Lib\Apis::Sample_v1_apis_get(...)

同 SDK 内的接口可本地化直接调用,不在本地的接口,会自动请求线上的接口,并按照开发者设定的规则收费。

__construct()

线上环境中的 Controller 不识别是魔术方法"__construct()"的,而是用"init()"代替,请不要使用此方法,但您可以参考以下写法:

public function init() {
    parent::init();
    ......
}

parent::init() 注意务必保留

用户界面(views)

模板文件统一存放在 /www/[app]/[ver]/views 目录下,可添加子目录,文件扩展名固定为 .phtml,用以下方法调用:

$this->template('sample');

WitFrame! 模板语法与 Discuz! 类似,但是模板变量只能调用放入 $this->G 中的变量,用 {#xxx} 方式引用。由模板变量引申出来的其他变量依然用 {$xxx}。

或者您可以在调用模板时通过以下方式人工引用模板变量:

$this->template('sample', array('user' => 'Monkeye'));

如上例代码中,在模板里可用 {#user} 引用

WitFrame! 模板语法

语法说明PHP
{loop $v1 $v2 $v3}...{/loop}循环语句foreach($v1 as $v2 => $v3) {...}
{if [condition]}...{elseif [condition]}...{else}...{/if}条件语句if ([condition]) {...} elseif([condition]) {...} else {...}
{echo [any]}显示echo [any]
{api_uri /[app]/[ver]/[controller]}返回controller的地址Common::getAPIURI('/[app]/[ver]/[controller]')
{api_static_uri /[app]/[ver]}返回static的地址Common::getAPIStaticURI('/[app]/[ver]')
{template [tplfile]}调用子模板

可用常量

PLUGIN_ROOT_PATH

应用根目录的路径,即 /[app] 的真实路径

PLUGIN_PATH

当前应用分支的路径,即 /[app]/[ver] 的真实路径

应用日志

在开发过程中您可以通过记录日志的方式跟进程序的流程以及错误,此日志会在 SDK 的 /log 目录下生成,在应用上线后也可以在“应用日志”中查看

相关函数

Logger::debug($message);    // Debug 级别日志
Logger::warning($message);  // Warning 级别日志
Logger::error($message);    // Error 级别日志
Logger::fatal($message);    // Fatal 级别日志
Logger::log($message);      // 普通日志,并可自定义级别

直接记录日志字串

Logger::log('this is a log');

打印 Exception 的错误

try {
    ...
} catch (Exception $e) {
    Logger::error($e);
    return;
}