Genelet是多编程语言框架,本开发指南适应于所有语言环境。
在讨论特例时,我们将用PHP语言作为样板。
URL格式
系统初始文件
编程简介
分量定义
Model
Controller
View
系统起始配置文件
配置文件为JSON格式,通常取名
config.json ,内含启动网站所需的所有参数。这里是常用的几个参数:
Document_root : 网站根目录
Project : 项目名称,第一个字母大写
Script : 动态接口(HANDLER)
Server_url : 服务器网址 (不含动态接口)
Pubrole : 外网公众角色代号
Template : 动态网页存放的文字模板根目录,
Uploaddir : 上传文件的根目录
Db : 数据库链接字符串,用多元数组表达。
Log : {"Filename": 文件位置名称, "Level": 日志等级},
Chartags : MIME类别,通常自动生成
Roles : 登录角色,通常自动生成
编程基础
在Genelet框架里,开发工作就是添加各种分量和指令。编程基本流程如下。
每个项目都至少需要两个Classes,用两个文件表达。model.php 继承Genelet里的Model。Model就是MVC开发原则里面的M。因为Genelet只用一个动态接口,所以分量共享同一个 Controller。filter.php 继承Genelet里的Filter,它是瘦身了的Controller(所以取不同的英文名"Filter")。
一个项目下可以有许多分量,每个分量放置在单独目录下。分量目录下有三个文件:component.json ,它是定义分量参数和ACL条件等的JSON配置文件,model.php 是继承项目的Model,filter.php 是继承项目的Filter。
componser.json ,Model和Filter完成后,此分量的编程工作即告结束。如果你只是调用 JSON API,那么不需要再做其它事。如果需要生成动态网页或H5应用,
你还需要设计出 MVC 里面的 View。
component.json
此文件的举例格式如下:
{
"actions" : {
"startnew":{"options":["no_method", "no_db"]},
"insert" :{"validate":["question_id","choice_text","votes"]},
"topics" :{"groups": ["public"]},
"edit" :{"validate":["id"]},
"update" :{"groups":["public"],"validate":["id"]},
"delete" :{"validate":["id"]}
},
"fks" : {
"m" : ["m_id", "m_md5", "id", "id_md5"]
},
"nextpages":{
"topics":[
{"model":"choice", "action":"topics", "relate_item":{"poll_id":"poll_id"}}
]
},
"current_table":"polls_choice",
"current_key" :"id",
"current_id_auto" :"id"
"insert_pars" :["question_id","choice_text","votes"],
"edit_pars" :["question_id","choice_text","votes","id"],
"topics_pars" :["question_id","choice_text","votes","id"],
"update_pars" :["question_id","choice_text","votes","id"]
}
执行指令集 actions
签名认证 fks
调用其它分量 nextpages
Genelet一个强大功能,是在一个分量里自动调用其它分量的RESTful指令
(类似于 GraphQL 的服务)。
数据库表格参数
current_table : 分量所用的数据库表格
current_key : 表格的主键
current_id_auto : 表格里自动计数栏(auto_increment)
insert_pars : 插入新记录时,哪些数据库栏目允许插入(通常是全部栏目)
topics_pars : 搜索多行时候,哪些栏目允许读出
edit_pars : 按照主键读取记录时,哪里栏目允许读出
update_pars : 按照主键更新记录时,哪些栏目允许更新
current_tables : (注意这里多了 s )用于JOIN在一起的多表格的 topics 指令
topics_hash : 定义多表格输出变量
model.php
此Class下每个函数,即为指令。例子:
<?php
declare (strict_types = 1);
namespace Sandy\Choice;
use Sandy;
class Model extends \Sandy\Model
{
public function update(...$extra) : ?\Genelet\Gerror {
if ($this->Get_rolename() == "p") {
return $this->Do_sql(
"UPDATE poll_choice SET votes=votes+1 WHERE choice_id=?", $this->ARGS["choice_id"]);
}
return parent::update(...$extra);
}
};
RESTful 继承
所有分量自动继承了Genelet系统的 RESTful 指令。即
插入一个新记录
public function insert (...$extra) : ?\Genelet\Gerror
数据来自 $_REQUEST ,$extra 表示需要补充插入的数据
搜索多行记录
public function topics (...$extra) : ?\Genelet\Gerror
数据来自 $_REQUEST ,$extra 表达WHERE里面的条件限制
按照主键调用行
public function edit (...$extra) : ?\Genelet\Gerror
数据来自 $_REQUEST ,$extra 表达WHERE里面的条件限制
按照主键更新行
public function update (...$extra) : ?\Genelet\Gerror
数据来自 $_REQUEST ,$extra 表达WHERE里面的条件限制
按照主键更新行,如果不存在就插入记录
public function insupd (...$extra) : ?\Genelet\Gerror
数据来自 $_REQUEST ,$extra 表达补充插入的数据
按照主键删除行
public function delete (...$extra) : ?\Genelet\Gerror
数据来自 $_REQUEST ,$extra 表达WHERE里面的限制
编写新指令
新添函数的格式必须是
public function 指令名称 (...$extra) : ?\Genelet\Gerror {
}
数据库函数
Genelet提供了一组高速执行数据库运算的程序库,供你在开发Model时使用。
我们将另文介绍。
filter.php
样本:
Role_name;
$action = $this->Action;
$obj = $this->Component;
return null;
}
public function Before(object $model, array &$extra, array &$nextextra) : ?\Genelet\Gerror {
$err = parent::Before($model, $extra, $nextextra);
if ($err !== null) { return $err; }
$ARGS =& $_REQUEST;
$role = $this->Role_name;
$action = $this->Action;
$obj = $this->Component;
return null;
}
public function After(object $model) : ?\Genelet\Gerror {
$err = parent::After($model);
if ($err !== null) { return $err; }
$ARGS =& $_REQUEST;
$role = $this->Role_name;
$action = $this->Action;
$obj = $this->Component;
return null;
}
}
Preset()
数据准备阶段,常见功能有:
补充输入数据,如用户IP
再次查看是否遗失必须的栏目
其它Form Validation,如数据格式是否准确
生成新数据,如从用户输入的密码,生成SHA1签名作为新密码
定义分页参数(pagination)
Before(object $model, array &$extra, array &$nextextra)
链接数据库前,需在
$model 里做的准备工作:
After(object $model)
获取数据后,可在这里做进一步处理。常见功能有
处理和更改数据,以便获得期待的显示方式。如 timestamp 里年份去掉。
根据特殊情况,生成新的(不易在Model里产生的)可用数据
调用其它分量
生成为传送EMAIL,SMS等额外服务需要的数控块。
变量
除了输入变量外,你可以从下面引导出常用变量,以便编程。
$ARGS =& $_REQUEST : 客户端输入数组
$role = $this->Role_name : 角色名
$action = $this->Action : 指令名
$obj = $this->Component : 分量名
$tag = $this->Tag_name : MIME代号