开发指导
更新时间: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 的文件放入不同的子目录中,同时类名用下划线 "_"
分隔每一层级,每层级的文件名(文件夹名)遵从同样的命名规范
见下表:
类名 | 文件名 |
---|---|
OneController | One.php |
One_TwoController | One/Two.php |
One_Two_ThreeController | One/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;
}