文档在完善中。。。
V1.5.4(内测版本) 0. pjax支持
- 增加master view ,让view 重用做到极致
- 生成的Model字段加上F前缀, 加上CLASS_NAME常量
- $column 修改为静态变量
- Model SQL查询改进,移除find_by_attr类方法;增加model sql查询
- 自动为表之间的关系生成get set方法; 类似 $objects配置方式
- 初步支持CODE to DB Migration: YZE_DBA::migration
- 初步支持mongodb;配合hook 可以轻松的在mysql之上加上mongodb缓存层
- yze_ajax_front_controller load 和get增加了缓存处理,当没有提交form时,重新打开之前的网址,之前的数据总是在那里;这是loadedCallback 回调的参数是null
- yze_ajax_front_controller load 去掉cancel回调
- 数据库存储时加上了相关策略,可以在外键冲突等情况下进行相应的调整(验证中)
- ajax post也加上了token机制,防止重复无效的提交
- 去掉post_result_of_json, 所有的相应格式都通过view format来处理
- 删除YZE_FILTER_BEFORE_CHECK_REQUEST_TOKEN hook,如果需要绕过token验证,controller重载check_request_token方法
- 解决通过一个表单打开两次,然后提交出现REQUEST_TOKEN_NOT_MATCH的问题
V1.5.3
- 增加mongodb,redis支持
- 修复/module/controller/123,无法解析vars参数bug
- 增加init.php,yangzie所有文件由他加载
- sql 可以查询多个sum,count,max,min可以查询多个
V1.5.2
Yangzie -- 轻松构造模块化的应用
- 易点互联: http://yidianhulian.com
- Tags: php, web, module
Yangzie的哲学
- 小到一个函数,大到一个系统都奉行输入-处理-输出的原则,输入、输出都要明确定义。
- 模块化,任何模块不在代码层面依赖其他模块,即使他们之间有功能逻辑上的依赖性
- 功能复用比代码重用更有价值
Yangzie的处理流程
- 初始化请求,解析请求信息,uri路由。出现异常进入yangzie的异常处理
- 验证用户是否登录(如果需要)。出现异常进入yangzie的异常处理
- 验证用户是否有权限(如果需要)。出现异常进入yangzie的异常处理
- 验证器验证数据。出现异常进入yangzie的异常处理
- 指派到控制器。出现异常进入控制器的exception方法
- 控制器返回响应。出现异常进入exception的异常处理
- 输出响应。出现异常进入exception的异常处理
特性
-
模块化
-
模块之间保持松耦合,各自独立
-
模块可以是一个目录,也可以打包成phar文件,可直接拷贝到其他使用yangzie开发到系统中直接使用
-
每个模块便是一个MVC系统,定义有自己的url路由,验证器,控制器,视图,model
-
模块之间调用通过url调用,只是这里的url不用在通过http,不用经过浏览器,比如在uri:example.com/order,处理的控制器是order,属于order模块,但是需要访问customer模块的userinfo控制器,以便得到客户的信息,只需要在代码中通过yze_go("/customer/userinfo?customer_id=24543"),便可得到客户的信息
-
灵活的视图
-
任何请求都可响应输出为html,xml,json,pdf,excel,word等输出模版。只需两步:
1.改变访问url后缀,无后缀默认返回html格式的内容,如example.com/order, 如果访问example.com/order.xml 将返回xml格式的内容,依此类推
2.在模块的views目录中加上对应的模版文件, 如order.xml.php;在次文件中定义你要返回的xml内容;视图文件的命名格式是:[控制器名].[格式].php; 如order.json.php返回json格式内容;order.pdf.php 返回pdf格式内容;order.tpl.php返回html格式内容。注意,格式除了tpl外其他都是你自己定义的。yangzie会根据url的后缀去找调用对应的模版文件输出内容
-
表单数据回显
-
只需在生成表单的地方加上一句代码调用:yze_get_default_value($object, $name, $controller)。比如 <input type="text" name="email" value="<?php yze_get_default_value($user, "email", $this->controller)?>"/>
-
在用户提交的数据验证器验证失败后,之前提交的数据会自动回显;避免用户重复再输入
-
自定义错误提示。用户输入错误在所难免,但出错后应该友好的提醒用户哪里错了,(当然输入正确的数据应该还在那里),把__yze_controller_error()放在合适的地方,出错后便会把错误消息显示在这里。该api是把错误消息集中显示在某个地方。如果想在错误的输入项附近显示错误消息,则只需要合适的地方调用__yze_field_error($field_name)。如 <input type="text" name="email" value="<?php yze_get_default_value($user, "email", $this->controller)?>"/> <?php yze_field_error("email") ?>
URI
解析规则
-
如果在 module.php 中定义了映射,则以该定义进行映射。url定义中可以自由设置正则表达式, 比如(?P<pa_id>\d+),这时便可通过$request->get_var("pa_id")得到实际的值
-
如果没有定义映射,则按照如下规则进行解析:/module/controller/var1/var2.... 第一个为模块,第二个为控制器,后面解析成变量,可通过$request->get_Var(1); $request->get_Var(2); 取到对应的值
-
灵活的URI路由。可定义表意明确的,可读性更好的uri
- uri是资源的请求地址,同时也是API,因为一个uri定义了明确的输入,和明确的输出
- 默认的路由规则是/module/controller/variable1/variable2。可通过$request->get_Var(1);得到variable1。
- 可以在module文件夹下的__module__.php中自定义路由规则:
'account/(?P\d+)' => array(//uri,前后不需要/,uri中的可便部分可写成正则表达式,该例中可通过$request->get_var("pa_id")得到实际uri中传入的值
'controller' => 'account',//处理该uri的控制器
'args' => array(
'action' => 'add',//自定义传入参数,通过$request->get_var("action")便可得到add;通常用于同一个控制器处理不同uri时用于区分
),
),
该例子中的映射可处理example.com/account/123232。这比example.com/account.php?id=123232更直观。同时被和yangzie的视图处理,可以任意返回需要的数据格式
数据提交
yangzie会防止数据重复提交,比如在网络比较慢的情况下用户重复点击了提交按钮
-
同一个uri可以直接使用在ajax环境中
-
验证器,把数据验证代码独立出来
-
数据验证是必不可少的,但在正式的逻辑处理之前,重复的写数据验证代码是很痛苦的。
-
验证器便是通过代码重用的方式,把数据验证逻辑独立出来.
-
验证器通过后才会进入控制器,这样保持控制器的逻辑处理代码简洁
-
验证器失败后会返回错误信息,这些信息将会显示在视图上
-
在验证器上通过如下的代码便可设置数据的验证
$this->assert('name', 'check_name', '', '');
$this->assert('email', YZE_Vadilater::NOT_EMPTY, '', 'email不能为空');
protected function check_name($method, $name, $rule){
$datas = $this->get_datas($method);
$willCheck = $datas[$name];//取当前编辑框内值
if(sameCheck()){
$this->set_error_message($name,"账户名重复");
return false;
}
return true;
}
其中name是要验证的请求数据名,check_name是自定义验证方法。 YZE_Vadilater::NOT_EMPTY是yangzie提供的验证方法
-
通过脚本生成基础代码
-
通过脚本可生成mvc代码结构
-
在yangzie根目录执行 php scripts/generate.php 便可进入yangzie脚本窗口,根据窗口的提示便可生成相关的代码文件
-
输出缓存
模块
一个模块是一组功能逻辑的集合。在yangzie中一个模块可以是一个文件夹,也可以是phar包(yangzie-cli可把一个模块目录打包成phar)。 模块的目录结构如下:
+module name | + controllers | + models | + views | + validates | + hooks | __module__.php | __hooks__.php
module.php中定义了该模块的接口URI。用户可通过浏览器直接访问这些URI,其他模块或者系统也可以通过编程访问这些URI。他们的区别是该URI响应不同(不同的响应格式),用户得到的是可读性好,美观的响应,如html,pdf。程序得到的是结构良好便于程序处理的响应,如xml,json,但含义一样。
模块只是复杂系统的一部分,肯定需要与同一个系统或者不同系统的模块之间进行功能调用。yangzie不建议直接在一个模块中直接应用另一个模块的代码(虽然完全可以这样做,php的require或者include另一个模块的php文件),yangzie提供两种方法进行模块之间的功能调用
通过URI API
通过编程访问另一个模块中定义的URI:yze_go($uri, $method, $return)。method表示对资源的操作,return为true表示以变量返回,false表示直接输出。这里的$uri需要指定返回的数据格式,如/order/3328473894.xml。
- 通过uri调用,yangzie会解析uri,指派到controller,处理响应
- 出现异常会抛出到调用环境中
通过HOOK
被调用的模块可以在__hooks__.php中定义hook name,然后注册hook处理函数:
define("HOOK_NAME","4");
YZE_Hook::the_hook()->add_hook(HOOK_NAME, function($data){
});
调用的模块可以通过yangzie hook api来触发hook,从而完成调用
do_hook(HOOK_NAME, $data);
他们的区别:
- uri调用返回的是文本内容,如json,xml等;通过hook调用可以得到的是php的数据格式如数组,对象等
- 如果调用不成功,都将抛出异常到调用环境中
请求的生命周期
多种输出格式的自动支持
Controller
- 控制器是具体访问uri的处理中心,控制器主要有下面几种方法,分别处理uri所代表的资源的增删改查操作
- get:获取uri指向的信息,请求数据通过get请求传递,返回YZE_IResponse
- post:创建信息,请求数据通过post请求传递,返回YZE_Redirect
- delete:删除信息,请求数据通过post请求传递,返回YZE_Redirect
- put:修改信息,请求数据通过post请求传递,返回YZE_Redirect
- __exception(YZE_RuntimeException $e) __:在前4中方法中的代码出现任何未抓取的异常时,都将进入该方法进行异常处理。也是返回YZE_IResponse,如果没有任何返回,则显示vander/views/500.tpl.php界面;如果像重新显示该资源内容(如post失败后,想重新显示get的内容),可以通过 return $this->wrapGet($this->get());