MVC 模块化开发框架
PHP JavaScript Other
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
.settings
app
scripts
tests
tmp
yangzie
.buildpath
.gitignore
.project
README.md
composer.json

README.md

文档在完善中。。。

V1.5.4(内测版本) 0. pjax支持

  1. 增加master view ,让view 重用做到极致
  2. 生成的Model字段加上F前缀, 加上CLASS_NAME常量
  3. $column 修改为静态变量
  4. Model SQL查询改进,移除find_by_attr类方法;增加model sql查询
  5. 自动为表之间的关系生成get set方法; 类似 $objects配置方式
  6. 初步支持CODE to DB Migration: YZE_DBA::migration
  7. 初步支持mongodb;配合hook 可以轻松的在mysql之上加上mongodb缓存层
  8. yze_ajax_front_controller load 和get增加了缓存处理,当没有提交form时,重新打开之前的网址,之前的数据总是在那里;这是loadedCallback 回调的参数是null
  9. yze_ajax_front_controller load 去掉cancel回调
  10. 数据库存储时加上了相关策略,可以在外键冲突等情况下进行相应的调整(验证中)
  11. ajax post也加上了token机制,防止重复无效的提交
  12. 去掉post_result_of_json, 所有的相应格式都通过view format来处理
  13. 删除YZE_FILTER_BEFORE_CHECK_REQUEST_TOKEN hook,如果需要绕过token验证,controller重载check_request_token方法
  14. 解决通过一个表单打开两次,然后提交出现REQUEST_TOKEN_NOT_MATCH的问题

V1.5.3

  1. 增加mongodb,redis支持
  2. 修复/module/controller/123,无法解析vars参数bug
  3. 增加init.php,yangzie所有文件由他加载
  4. sql 可以查询多个sum,count,max,min可以查询多个

V1.5.2

Yangzie -- 轻松构造模块化的应用

Yangzie的哲学

  1. 小到一个函数,大到一个系统都奉行输入-处理-输出的原则,输入、输出都要明确定义。
  2. 模块化,任何模块不在代码层面依赖其他模块,即使他们之间有功能逻辑上的依赖性
  3. 功能复用比代码重用更有价值

Yangzie的处理流程

  1. 初始化请求,解析请求信息,uri路由。出现异常进入yangzie的异常处理
  2. 验证用户是否登录(如果需要)。出现异常进入yangzie的异常处理
  3. 验证用户是否有权限(如果需要)。出现异常进入yangzie的异常处理
  4. 验证器验证数据。出现异常进入yangzie的异常处理
  5. 指派到控制器。出现异常进入控制器的exception方法
  6. 控制器返回响应。出现异常进入exception的异常处理
  7. 输出响应。出现异常进入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());

Model

View, Response

Validater

全局唯一的YZE_Request

代码结构

Hooks