YYUC开发手册(某微信平台开发框架)
更新时间:2024-05-04 19:04:01 阅读量: 综合文库 文档下载
- 一语成谶推荐度:
- 相关推荐
YYUC开发手册
版权申明
发布本资料须遵守开放出版许可协议 1.0 或者更新版本。
未经版权所有者明确授权,禁止发行本文档及其被实质上修改的版本。 未经版权所有者事先授权,禁止将此作品及其衍生作品以标准(纸质)书籍形式发行。
有任何问题,请联系版权所有者 admin@yyuc.net 。
YYUC-PHP框架官方地址http://www.yyuc.net 。有关YYUC-PHP项目及本文档的最新资料,请及时访问项目主站。
本文档及其描述的内容受有关法律的版权保护,对本文档内容的任何形式的非法复制,泄露或散布,将导致相应的法律责任。
框架简介
YYUC-PHP框架简介
YYUC-PHP框架(本站简称YY框架)是一个面向自由开发者的框架,只需一个人就可以轻松搞定一个动态网站,或者是小型的信息系统建设。当然这 并不是说YY框架只适用于小型系统,应用于多人开发的大型项目它同样极具优势。YY框架的设计初衷就是敏捷开发快速建站,由于是完全开源和免费的,很显然 它将是小型企业和个人网络开发者的首选。
YY框架是一个免费开源的,快速、简单的PHP开发框架,我们采取大道至简的原则,并不严格遵循面向对象的开发模式,追求极致的开发效率和运行效率 才是我们的初衷。YY框架遵循Apache2开源协议发布,社区的个人和团队为其贡献力量,代码的贡献,审阅,测试每一个步骤都力求完美。
使用YY框架,你可以更方便和快捷的开发和部署应用。不仅仅是网络应用,企业级应用开发更是可以从YY框架的简单、快速、稳定、高效的特性中受益。 你可以免费使用YY框架,遵从Apache2开源协议我们允许把你基于YY框架开发
开源或商业产品并将之发布或销售。
优势所在
Asp,J2ee,.net,php,Ruby on Rails......,到底要选择什么?在从事网络开发的几年里,以上的几种语言的项目都参与设计或开发过。我想通过以下几点简单的筛选帮您找到答案:
1、先进性:很显然asp已经不再适应这一要求了。微软也不再主推它,没有先进的程序设计思想的支撑,没有面向对象的优势我想除了上世纪90年代开始开发的程序员,已经没有人再会选择他。
2、学习成本:j2ee的开发首先要掌握java的基本程序设计基础,面向对象的思想,mvc框架结构,开源或者官方的框架平台,ssh(j2ee开发必修),ejb,rest等等等等,百家齐放的框架,累的程序员不亦乐乎。
3、开放性(跨平台):.net是需要运行在其平台之上的,复杂的配置选项,常常弄得你不知道到底是业务优先还是配置优先了,当然.net的最大瓶颈还不在此,他所运行的Windows环境的服务效能是无法和linux平台相比的。
4、敏捷性:敏捷开发无非强调开发的效率,以最低的人力投入完成设计开发、实现业务需求。曾经看到过处理一个数据表的crud操作的代码量的统计调 查,java 和 C#大约在600行左右(包括配置文件),php(无框架) 90行左右,Ruby on Rails 60行左右。
5、流行性:Ruby on Rails在国外已经非常流行了,但是我想开发过rails的程序员都有这么一个感受,一个功能Coding的时间是一个月,那其中的5天你要花在环境的 搭建和相关插件的安装上。3天的时间要花在服务器环境的配置上。同样Rails和J2ee一样很难独立运行在虚拟主机上,对于自由开发者服务器成本也是一 笔不小的开支。
6、执行效率:j2ee更适合大型的企业级开发,因为基本上是局域网,服务器内存是10G级别的,所以我们的代码可以一堆再堆,反正不用考虑性能和 带宽。放在互联网上j2ee就显的那么臃肿和笨重。坦率的讲,这一点上.net的优势倒也是很明显的,但是谁又会那么笨的首选Windows服务器呢。 RoR 和php都是解释执行的,没有编译这一步骤,可能效率上会有一定影响,但是您不要忘了,他们的底层都是C,大量的系统函数和扩展插件都是C解释编写的,在 这种高度封装和扩展下,真正您自己的代码才有多少呢?php的最大优势是程序不常驻内存,虽然不能像java那样轻松的使用像application这样 的全局对象了,但是php的服务内存是不会增长的,请求执行之后就会释放掉,像j2ee如果程序设计的不周全,Web Server内存就会越来越大,直至当机!
YY框架是一个高效稳定的PHP框架,轻量级是她最大的优势。熟悉Ruby On Rails的开发人员都知道约定优于配置的原则,这一原则简化了程序开发者的大量配置
工作和框架思考。YY框架很大程度上借鉴并优化了Rails的这一设 计思想。毫不夸张的讲有了YY框架其他的PHP框架就显得有些失色。要么全面而笨重,要么简单而不稳定,要么配置复杂难于学习和理解。
很高兴的告诉你,恭喜你找到了YY框架,高效的开发会让你将网络程序设计视为生活的一种享受。
特点及性能
YY框架借鉴了国内外很多优秀的框架和模式,并在这些设计思想的基础上进行了优化和改进,遵循开发运行一切从简的原则,用强大的框架核心支撑基于YY框架的业务代码,一部分重要的特性和优点列举如下: 智能路由MVC架构:
YY框架采用智能路由架构模式。利用这一的匹配模式,开发人员可以方便的设计系统URL规则,不再需要定义单一的控制器类,而是采用传统的目录结构处理用户请求,与传统的php开发做到了很好的技术过度。 项目层次直观明了。 预编译机制:
独有的模式转换功能,一键切换开发模式和生产模式。根据不同的模式采取不同的编译方案。特有的JS,CSS等文本文件的压缩机制和GZip压缩输出机制,最大效率的利用网络带宽。 自动类库导入:
YY框架的所有插件库均采用动态自动加载的方案进行按需加载,开发者无需手动引入,提高开发效率。 ORM和验证统一:
简洁轻巧的ORM实现,配合简单的CURD操作接口让开发效率得到极大的提高,更有前后台统一验证规则,让开发人员无需重复劳动,JS验证和PHP入库验证无缝衔接。 优化查询语言:
内建丰富的查询机制,包括组合查询、快捷查询、复合查询、区间查询、统计查询、定位查询、多表查询、子查询、动态查询和原生查询,让你的数据查询简洁高效。
动态和静态模型互补:
无需创建任何对应的模型类,轻松完成CURD操作。对于负载的DB模型处理,开
发这可以采用自动生成的静态模型,进行虚拟字段的填充与回写,数据有效性的验证,模型功能的扩展等等。 高效模板引擎:
YY框架自建的模板编译执行引擎,最大限度的贴合原生php写法,让初学者更容易上手,高级开发人员更灵活应用。 前后台统一AJAX规则:
前后台ajax互动高度统一,三行js代码和一行php代码就可以完成ajax异步请求操作,极大的提高了开发效率和用户体验。 国际化支持:
先进易读的yaml标记语言,用户语言自动检测和默认指定。全站国际化和部分国际化并存,缓存国际化识别引擎为开发者提供极速的多语言网站开发效率。 缓存机制:
系统支持跨服务器缓存,数据检测机制缓存,时间过期机制缓存,基本文件缓存等多种缓存规则,最大限度的利用缓存功能减少服务器开销。 多网站并存机制:
即使你用的是一个虚拟主机,在服务商不允许架设多个网站,YY框架可以通过内置的路由规则为你解决这一问题。 多库并存机制:
YY框架集成多库集成调用方式,内置了分布式数据库的支持可以通过程序切换数据库连接,不人为指定的情况下自动实现主从式数据库的读写分离等(注意:主从数据库的数据同步工作不在框架实现,需要数据库考虑自身的同步或者复制机制。)。
简明教程
基础准备
不懂php开发环境搭建的可以去网上搜索下。相信学习这个框架的童鞋们也都不是菜鸟级的了。 我习惯开发中直接用实际要发布的域名来做测试,这样将来发布后会省去一些不必要的麻烦。 假如你的程序将来要发布到域名www.test.com上,这里简单介绍一下方法:
1、修改本机host ,把你要测试开发的网络地址指向本地: 用文本编辑器打开:C:\\Windows\\System32\\drivers\\etc\\host 文件 最后一行添加:
? 127.0.0.1 www.test.com
这样从你本机的浏览器请求网址www.test.com 都会被解析到你的本机ip : 127.0.0.1上。
2、打开apache的 Virtual Hosts配置文件 建立添加虚拟网站文件映射。 ?
? ServerAdmin mqqkobe@163.com ? DocumentRoot \? ServerName www.test.com
? ErrorLog \
? CustomLog \?
3、根据上面的配置可以看出,需要把工程test的开发目录拷贝到D:/php下 4、默认情况下把框架的参考系统源码目录也拷贝到D:/php下
开发工具
这里推荐eclipse的php开发工具(PDT),笔者是从java开始接触程序开发的所以推荐eclipse 下载地址:http://eclipse.org/pdt/downloads/ 一般下载all in one就好。
本人本地配的域名是框架网站的主域名: ?? 127.0.0.1 www.yyuc.net
特别说明:
1、因为示例中配置的域名是www.yyuc.net,所以下文所提到 www.yyuc.net的地方你都需要自换成自己的域名。
2、为了让你更了解YY框架的原理和构成,我们先介绍几个简单的示例再介绍开发管理中心的使用,虽然开发管理中心会帮助我们省去一些敲代码的工作量,但是作为初学者,还是建议你一步一步的往下看。 Nginx的配置:
linux下我们更常用nginx来代替apache完成页面请求转发的工作,下面是在一个简单的nginx配置示例:
?? user www www; ??
?? worker_processes 1; ??
?? error_log /home/wwwlogs/nginx_error.log crit; ??
?? pid /usr/local/nginx/logs/nginx.pid; ??
?? #Specifies the value for maximum file descriptors that can be opened by this process.
?? worker_rlimit_nofile 51200; ??
?? events ?? {
?? use epoll;
?? worker_connections 51200; ?? } ?? ?? http ?? {
?? include mime.types;
?? default_type application/octet-stream; ??
?? server_names_hash_bucket_size 128; ?? client_header_buffer_size 32k; ?? large_client_header_buffers 4 32k; ?? client_max_body_size 50m; ??
?? sendfile on; ?? tcp_nopush on; ??
?? keepalive_timeout 60; ??
?? tcp_nodelay on; ??
?? fastcgi_connect_timeout 300;
?? fastcgi_send_timeout 300; ?? fastcgi_read_timeout 300; ?? fastcgi_buffer_size 64k; ?? fastcgi_buffers 4 64k;
?? fastcgi_busy_buffers_size 128k; ?? fastcgi_temp_file_write_size 256k; ??
?? gzip on;
?? gzip_min_length 1k; ?? gzip_buffers 4 16k; ?? gzip_http_version 1.0; ?? gzip_comp_level 2;
?? gzip_types text/plain application/x-javascript text/css application/xml; ?? gzip_vary on; ??
?? #limit_zone crawler $binary_remote_addr 10m; ??
?? #log format
?? log_format access '$remote_addr - $remote_user [$time_local] \
?? '$status $body_bytes_sent \?? '\?? server ?? {
?? listen 80;
?? server_name www.yyuc.net;
?? index index.html index.htm index.php; ?? root /home/test/pub; ??
?? location / {
?? if (!-e $request_filename) { ?? rewrite ^/(.*)$ /index.php last; ?? } ?? } ??
?? location ~ .*\\.(php|php5)?$ ?? {
?? try_files $uri =404;
?? fastcgi_pass unix:/tmp/php-cgi.sock; ?? fastcgi_index index.php; ?? include fcgi.conf; ?? } ??
?? location /status { ?? stub_status on; ?? access_log off; ?? } ??
?? location ~ .*\\.(gif|jpg|jpeg|png|bmp|swf)$ ?? {
???expires 30d; ???} ???
???location ~ .*\\.(js|css)?$ ???{
???expires 12h; ???} ???
???access_log /home/wwwlogs/access.log access; ???} ???}
hello world
功能需求:
输入地址http://www.yyuc.net/demo/hello.html,页面显示hello wolrd字符。 通过阅读和学习通用简单路由,你会知道这个请求页面的控制器文件是: ???controller/demo/hello.php。
在controller文件夹下建立demo目录和hello.php文件。
方式1:
编辑hello.php 代码如下:
???
???Page::ignore_view();
???Response::write(\????>
其中page类是对页面的一个封装类,里面有一系列的静态参数和方法供控制器直接修改和调用。
page::$need_view 默认为 true,执行完这个php文件之后框架会继续加载它对
应的视图文件来执行,Page::ignore_view()将其设为 false则执行完php文件后就不再寻找视图文件了。
Response::write 方法是向客户端进行文本输出,执行后立即退出脚本。
方式2:
hello.php 文件不写任何代码,可以建立空文件:controller/demo/hello.php。 建立文件:view/default/demo/hello.html hello.html内容为: ???
hello World
由此可见,如果没有执行Page::ignore_view(),框架执行了hello.php文件之后,控制器会自动寻找视图文件hello.html文件加载执行。
方式3:
修改配置文件conf.php将$auto_find_view改为true。 ???/**是否开启无控制器时自动寻找对应视图~默认:false*/ ???public static $auto_find_view = true;
无需创建控制器文件直接建立文件:view/default/demo/hello.html 内容为:
???
hello World
配置数据库
配置数据库连接
这只是一个标准示例,实际开发中并不一定一定按照示例的方式进行。 框架的主配置文件是/yyuc/conf.php,它是一个被封装好的静类文件,有关数据库的配置如下:
???/**数据库地址~*/
???public static $db_host = \???/**数据库端口~*/
???public static $db_port = \???/**数据库名~*/
???public static $db_dbname = \
???/**数据库用户名~*/
???public static $db_username = \???/**数据库密码~*/
???public static $db_password = \???/**数据库表前缀~*/
???public static $db_tablePrefix = \
建立数据库和表
可以通过自己常用的mysql管理工具完成这一工作。这里我们建立的表名称是:qq_notes DDl语句如下:
???CREATE TABLE `qq_notes` (
???`id` int(11) NOT NULL auto_increment COMMENT '主键', ???`author` varchar(255) default NULL COMMENT '作者', ???`theme` enum('Arts','Emotion','Humanities','Technology') default NULL COMMENT '主题:艺术,情感,人文,科技',
???`title` varchar(255) default '新建题目' COMMENT '标题', ???`content` text COMMENT '内容',
???`bepublished` tinyint(1) default NULL COMMENT '是否发布', ???`postdate` int(11) default NULL COMMENT '提交时间', ???PRIMARY KEY (`id`)
???) ENGINE=InnoDB DEFAULT CHARSET=utf8; 关于数据表的创建有以下几点说明:
1、像Rails一样,如果要通过面向对象的方式操作,YY框架要求如果表要依据Model类操作必须有一个名为\int类型的自增主键。
2、建议所有字段都要有注记,一是易于表的维护和管理,二是在自动代码生成过程中减少生成后的代码的后期修改量,实现根据注记内容动态修改字段描述的功能。
3、对于布尔类型,用tinyint(1)表示,0代表:否,1代表:是。 下面两条可以根据开发者的喜好采用:
1、对于日期类型和日期时间类型,用int(9)表示,php开发中因为time()和date()方法的存在大多数开发者喜欢用数据库的int类型表示时间而放弃了date和datetime。
2、根据喜好可以对于枚举类型,通常页面上会用下拉框或单选按钮的形式与其关联,所以在枚举字段的注记中采用\ 进行描
述,\这样在代码生成后这些注释会自动关联到下拉框的text上。如果只是有注解而没有针对每一项的描述,则每 项的值和text是一样的。
以上的数据库设计规则是YY框架约定的,当你按照这些规则设计数据表时,你的开发工作量将大大降低
访问路径设计
访问设计
要完成基本的增删改查工作,通常要有以下几个页面: ???1) 单个项目的新增页面 ???2) 多个项目的列表页面
???3) 单个项目的详细信息页面 ???4) 单个项目的修改页面 这里按照管理我们的URL设计如下
单个项目的新增页面 ---> www.yyuc.net/notes/creat.html
多个项目的列表页面---> www.yyuc.net/notes/index.html (也可已访问:www.yyuc.net/notes/)
单个项目的详细信息页面---> www.yyuc.net/notes/show-?.html( 其中的问号代表项目ID)
单个项目的修改页面--->www.yyuc.net/notes/edit-?.html( 其中的问号代表项目ID)
开发顺序
我们按照:新增,列表,详细,修改的顺序进行逐个页面的程序开发。
新增页面展示
创建控制器文件:controller/notes/creat.php 对应新增的控制器。 creat.php 内容如下:
???
???$note = new Model('notes'); ????>
这句话的意思是依照表:qq_notes创建模型文件。
为什么传入的参数中\没有写呢,因为为了一库多用,我们在数据库配置中将\数据库表前缀\设置为了:qq_。那么对于程序开发来说,所有的对表qq_notes的描述都要用到他除去前缀之后的名字:notes。
创建视图文件:view/default/notes/creat.html 对应新增的视图。 creat.html 内容如下:
??? ??? ???
???CRUD测试 ??? ?????? ??? ???
charset=UTF-8\
好了,新增页面的展示工作就完成了,可能你会对页面上的这些标签感到奇怪,甚至会想:\哎呀,又是该死的视图标签,要学这个框架就要掌握这些烦人的标签了\。
不急让我们先访问以下这个页面,之后你就会发现,YY框架的标签是这么的易学和神奇。
输入网址:http://www.yyuc.net/notes/creat.html,我们可以看到页面展示出来。
因为标题(title)字段的默认值是:\新建标题\,所以该项内容会自动填充,让我们来测试以下,我们把数据库中主题(theme)字段的默认值修改为:\:
刷新下页面你会发现主题字段的默认值随之改变了。
关于模板标签的说明:
对于在控制器中定义的模型变量(如上例中的\,可以在对应的视图中展示针对不同字段的相应的标签:
表单项 对应html 备注 all ... 模型所有非空属性的表单集合(隐藏的) text 文本框 checkbox ... 下拉框 radio 富文本编辑器 color
鼠标点击\发表时间\文本框时,会有日期选择框弹出,这是因为框架会对每个页面自动引入Jquery库和基于Jquery的框架适配器。视图页面中你不需要添加一行js代码就能实现这一功能。
你可能还会有疑问,前面提到的数据库设计中的注记在这个页面中并没有体现出来,好吧,我们把creat.html 的内容改成这个样子: ??? ??? ???
???CRUD测试 ??? ???charset=UTF-8\
??? ??? ???
刷新页面显示效果和之前的是一样的。
新增信息保存
修改控制器文件:controller/notes/creat.php 。
???
???$note = new Model('notes'); ???if(Request::post()){
???//如果有post信息 则认为是新增后的Form提交
???//单纯的post信息判断是不安全的 因为没有具体的字段要求和判断所以可以这样写
???$note->load_from_post(); ???$note->save(); ???} ????>
访问:http://www.yyuc.net/notes/creat.html,页面上填入一些测试数据点击\提交”。
这样各个字段的信息就会自动的保存到数据库中了。
信息列表展示
用户访问时默认展示列表页,所以我们建立的列表页面的控制器名称为index.php。
创建控制器文件:controller/notes/index.php 对应列表展示的控制器。
index.php 内容如下:
???
???$note = new Model('notes'); ???$notes = $note->list_all(); ????>
创建视图文件:view/default/notes/index.html 对应列表展示的视图。 index.html 内容如下:
??? ??? ???
??????
???
???{loop $notes as $n} ???
???{$n->title} ???{$n->author}
???{$n->field_text('theme')} ???{date('Y-m-d',$n->postdate)} ??? ???{/loop} ??? ??? ??? ???
charset=UTF-8\
对于theme字段,因为存储为枚举类型,而枚举的值不是最终要显示的值,所以调用field_text方法展示要调用的文本。
浏览器输入:http://www.yyuc.net/notes/,一个信息列表页面就展现在你面前
了。
此时,我们再修改下新增页面,使新增完成后自动跳转到列表页 creat.php 内容改为:
???
???$note =new Model('notes'); ???if(Request::post()){
???//如果有post信息 则认为是新增后的Form提交
???//单纯的post信息判断是不安全的 因为没有具体的字段要求和判断所以可以这样写
???$note->load_from_post(); ???$note->save();
???Redirect::to('index'); ???} ????>
通过调用框架的Redirect::to方法而不是直接的视图引用,可以有效的屏蔽了F5刷新引起的重复提交问题。
信息详细页面
创建控制器文件:controller/notes/show.php 对应详细信息展示的控制器。 show.php内容如下:
???
???$note = new Model('notes'); ???$note->find(get(1)); ????>
创建视图文件:view/default/notes/show.html 对应详细信息展示的视图。 show.html 内容如下:
??? ??? ???
??????
???
???{loop $notes as $n}
charset=UTF-8\
???
???{$n->author}
???{$n->field_text('theme')} ???{date('Y-m-d',$n->postdate)}
???id}.html');}\删除 ??? ??? ???{/loop} ??? ??? ??? ??? 关于模板标签的说明:
1、 对于视图模板中的JS方法,因为同样是要包含大括号\所以在模板解释中会被解析器误认为是PHP模板标签,解决的方法是对于JS方法”{”之后要紧跟空格或者回车,这样解释器就不会将其解释成php语言。
2、 因为IE的某些问题,当要用到JS跳转时要调用框架中的goto方法,请不要采用传统的location.href=?的方式。这样控制器中的Redirect::back()方法才会生效。
创建控制器文件:controller/notes/delete.php 对应信息删除的控制器。 delete.php 内容为:
???
???if (isset($_GET[1])){
???//指定要操作的模型id 删除之 ???$note = new Model('notes'); ???$note->id($_GET[1]); ???$note->remove(); ???}
???//返回请求前的页面 ???Redirect::back(); ????>
信息修改页面
创建控制器文件:controller/notes/edit.php 对应每条数据的修改页面。
edit.php代码如下:
???
???$note = new Model('notes'); ???if(get()){
???//如果存在get提交的信息 ???$note->find(get(1)); ???} ????>
创建视图文件:view/default/notes/edit.html 对应修改展示的视图。 edit.html 内容如下:
??? ??? ???
???CRUD测试 ??? ??? ??????{T navigation} ??? ???
???
charset=UTF-8\
???
???{loop $notes as $n} ???
???{$n->author}
???{$n->field_text('theme')} ???{date('Y-m-d',$n->postdate)}
???id}.html');}\删除 ??? ??? ???{/loop} ??? ??? ???
???
{P}标签是通用分页标签的标识。 更多关于分页的详细信息,请参阅视图中的分页
多插入几条数据,浏览器访问http://www.yyuc.net/notes/你会看到分页效果,如此的简单不是吗?
URL路由规则
通用简单路由
YY框架遵循简单路由约定,按照约定实现页面路由控制非常简单。
本节通过几个简单的示例让你你很快了解到YY框架的默认URl简单路由规则。
假设你网站的域名是http://www.yyuc.net:
访问地址 控制器 视图
http://www.yyuc.net controller/index.php view/default/index.html 1、这个请求指向网站首页,它会跳转到你在conf.php文件中中配置的首页面。
不特殊指定则会按照上表中的方式跳转。
2、其中的default是你在/yyuc/conf.php中指定的模板库,你也可以指定到其他的视图模版文件夹,这样你只需要改动下配置 你的网站展现就会焕然一新。 访问地址 控制器 视图
http://www.yyuc.net/login.htcontroller/login.pview/default/login.html hp ml 也可以在控制器中自由指定视图如: 让此次请求跳转到view/default/test.html视图等等...
访问地址 控制器
http://www.yyuc.net/user/licontroller/user/lisst.html t.php
访问地址 控制器
http://www.yyuc.net/user/listcontroller/user/li-ad.html st.php
视图
view/default/user/list.html
视图
view/default/user/list.html
要说明的是: http://www.yyuc.net/user/list-ad.html相当于通常意义上的http://www.yyuc.net/user /list.html?1=ad 在/yyuc/controller/user/list.php 中你可以通过 Request::get(1) 得到它。 如: $name = Request::get(1); 则 $name的值为:\。
访问地址 控制器 视图
http://www.yyuc.net/user/list-controller/user/liview/default/user/liad-qq.html st.php st.html 和上一路径类似: http://www.yyuc.net/user/list-ad.html相当于通常意义上的http://www.yyuc.net/user/list.html?1=ad&2=qq
在/yyuc/controller/user/list.php 中你可以通过如: $name0 = Request::get(0); $name1 = Request::get(1); $name2 = Request::get(2); 则$name0的值为:\的值为:\, $name2的值为:\。 其他类似的请求参数以此类推。例如:/list-ad-qq-name-yyuc.html。
分页以\作为分割参数
访问地址 控制器 视图
http://www.yyuc.net/user/list-acontroller/user/lview/default/user/lid-qq_1.html ist.php st.html
注意 http://www.yyuc.net/user/list-ad-qq.html 等http://www.yyuc.net/user/list-ad-qq_1.html 即为第1http://www.yyuc.net/user/list-ad-qq_2.html 则为第2页。
路径补充
同页于 ,
形如 http://www.yyuc.net/user/list.html?name=aaa 的请求在后台通过Request::get('name')方法也是可以获取到值的,如何传参开发中根据实际情况而定,只是出于SEO的友好考虑我们建议 用\标识get请求参数。
自定义路由
若想实现复杂的路由,你需要掌握重写路由的方式。 在YY框架中我们提倡使用简单路由进行开发。
简单路由会大大减少开发过程中的配置工作量,代码易读且易于维护。 但是有的时候为了减少代码量,你可能需要把很多请求都指向一个控制器,或者干脆所有请求都指向一个特定的控制器,这个时候你就需要掌握自定义路由了。 YY框架中自定义路由是非常简单的,只需修改配置文件中的路由配置就好,下面详细的为你介绍。
在框架内部定义了一个特殊的路由替换解析器以满足自定义路由的需求:
绝对路由规则
在修改Conf类文件的静态变量routing,例如改为: ???/**一般的绝对路由规则*/
???public static $routing = array( ???'admin/'=>'system/users/admin/', ???'user'=>'system/users/user', ???);
那么在路由请求中:
用户访问:http://www.yyuc.net/admin/ http://www.yyuc.net/system/users/admin/
等
同
于
访
问
用户访问:http://www.yyuc.net/user.html 等同于访问 http://www.yyuc.net/system/users/user.html
前置路由规则
在修改Conf类文件的静态变量routing,例如改为:
???/**一般的前置路由规则*/
???public static $routing_bef = array( ???'admin/'=>'system/users/admin/', ???'user'=>'system/users/user', ???);
那么所有URL地址中以admin/开头的请求都会自动跳转到以system/users/admin/ 开头的请求之中。
用户访问:http://www.yyuc.net/admin/add.html 等同于访问 http://www.yyuc.net/system/users/admin/add.html
用户访问:http://www.yyuc.net/useradmin-3.html?abc=bca 等同于访问 http://www.yyuc.net/system/users/useradmin-3.html?abc=bca
正则表达式的路由规则
有的时候你要匹配的路由内容可能不只是单单的固定记录,这个时候你就要用到正则表达式了:
???/**正则表达式的路由规则*/
???public static $routing_reg = array( ???//新闻入口
???'/news\\/20\\d{2}\\/index(_\\d+)?$/' => 'news/index', ???'/news\\/20\\d{2}\\/\\d+\\/\\S*$/' => 'news/show', ???'/news\\/index(_\\d+)?$/' => 'news/index', ???);
以上的这段规则是网站新闻入口的规则方式: 用户访问:/news/2012/ 会跳转到 news/index.html
用户访问:/news/2012/index_5.html 会跳转到 news/index_5.html 用户访问:/news/2012/35/abc.html 会跳转到 news/show.html 用户访问:/news/ 会跳转到 news/index.html 注意:
路由匹配的顺序是自上而下的:
先进行一般路由匹配,匹配不通过时如果开启了无控制器自动寻找视图功能则先寻找匹配的视图。
如果仍然无法进行匹配再进行绝对路由规则匹配、前置路由规则和正则表达式的
路由规则的匹配,直到找到匹配的控制器。
经过以上步骤还是无法找到匹配的控制器的话,则会跳转的404页面。
模型
模型简介
对于一个基于MVC模式的框架,模型类是必不可少的,YY框架的模型分为两种,简单模型(SampleModel)和数据库(Model)模型。
简单模型是对任何数据类型的一个统一封装。我们主张任何数据类型都被封装在模型之中,这样有利于数据的统一校验维护和管理。
数据库模型继承自简单模型,在简单模型的基础上实现了针对数据库表的实例化操作,让开发者对数据库的操作更加便捷。
对于复杂的模型操作,如实现类似Active Record的模型操作,开发这可以创建自己的模型类,继承简单模型(SampleModel)或数据库(Model)模型。 在原有模型基础上实现方法的重写和新增。
简单模型
使用入门
假设你要实现一个前台的form表单向后台提交数据,提交的数据你并不需要保存在数据库之中。这时候你就可以使用SampleModel了。 看下面的例子: 控制器mmsz.php:
???//简单模型记录前台密码
???$m = new SampleModel('password'); ???
???if($m->try_post()){//密码被传入 ???
???if($m->new != $m->again){
???Session::once('cperr','两次密码不一致!'); ???return; ???}
???$admin = new Model('admin');
???$admin->id = Session::get('uid'); ???$admin->password = $m->old;
???if(!$admin->is_real(array('id','password'))){ ???Session::once('cperr','原始密码不正确!'); ???return; ???}
???$admin->password = $m->new; ???if($admin->save()){
???Session::once('cpsuc','密码修改成功!'); ???$m = new SampleModel('password'); ???} ???}
视图内容mmsz.html:
???
???
??? ???
???密码修改 ???
???
???
??? ??? ???
??? ???
上例控制器中的前10行是简单模型的初始化和信息提交。验证成功才保存到数据库表admin中。
admin表的操作方法请参阅下一节的数据库模型 方法列表 __construct
???SampleModel::__construct(string $tablename, string $postid, boolean $isorgin) ???构造函数 ???
???Parameters:
???string $tablename 虚拟表名
???string $postid 表单提交的区分ID ???boolean $isorgin 是否是通用模型类
$postid用来区分相同表名的模型,区分$postid之后同一个页面就可以提交多个相同类型的模型了。 all
???SampleModel::all(string $names) ???所有有效的数据都输出hidden标签 ???这是一种页面参数整体传递的简便方式
???为了便于灵活覆盖,建议将其放在Form的最顶端(tk方法之后) ???把页面信息放在页面中是很不安全的,所以强烈建议只在新增时使用此方法 ???
???Parameters:
???string $names 字段名称数组 ???Returns:
???string 标签html字串 elid
???SampleModel::elid(string $name) ???获得页面标签的id ???Parameters: ???
???string $name 字段名称 标签name ???Returns:
???string 标签id elname
???SampleModel::elname(string $name) ???获得页面标签的name
???如果开启了表单令牌此处获得的name是经过框架加密的(防止恶意信息提交) ???
???Parameters: ???
???string $name 字段名称 标签name ???Returns:
???string 标签id field_form_name
???SampleModel::field_form_name(string $name) ???取得属性再Form中的name(未经加密的) ???
???Parameters:
???string $name 字段名称 标签name ???Returns: ???string load_from_get
???SampleModel::load_from_get() ???根据get请求内容填充这个Model
???这个方法通常用在信息检索页面的批量属性提交 ???切不可用此方法得来的数据进行CUD操作! ???
???Returns:
???Model 模型本身 load_from_post
???SampleModel::load_from_post() ???根据post请求内容填充这个Model ???这是表单字段自动提交的最常用方法 ???
???Returns:
???Model 模型本身 try_get
???SampleModel::try_get()
???试探行的填充这个model 如果能填充则采用post填充并返回:true否则返回:false ???
???Returns: ???boolean try_post
???SampleModel::try_post()
???试探行的填充这个model 如果能填充则采用post填充并返回:true否则返回:false ???
???Returns: ???boolean
数据库模型
数据库模型简介
YY框架的数据库模型是一种ORM的提现方式。首先阅读这一小节之前请确保已经阅读过简单模型。
因为数据库模型继承自简单模型,所以简单模型的用法对数据库模型统统适用。 继续上一节中的例子: 控制器mmsz.php改为:
???//简单模型记录前台密码
???$admin = new Model('admin');
???$admin->id = Session::get('uid'); ???if($admin->try_post()){//密码被传入 ???
???if($admin->new != $admin->again){
???Session::once('cperr','两次密码不一致!'); ???return; ???}
???if(!$admin->is_real(array('id','password'))){ ???Session::once('cperr','原始密码不正确!'); ???return; ???}
???$admin->password = $admin->new; ???if($admin->save()){
???Session::once('cpsuc','密码修改成功!'); ???} ???}
视图内容mmsz.html:
???
???
??? ???
???密码修改 ???
???
???
??? ??? ???
???
???
上例控制器中的操作全部是由数据库模型完成的,其中new和again字段在正式的数据库表结构中并不存在, 不用担心在执行save()方法时框架会自动过滤掉数据库中不存在的字段,把变化的字段自动更新到数据库中。
save()既可以新增也可以更新,判断的依据是模型的id属性,不存在id时为新增,存在id时为更新。 方法列表
下面列举的方法是数据库模型中特有的,简单模型中列举过的方法此处就不再列举了。 avg
???Model::avg(string $field, miexd $condition, miexd $pam) ???查询并返回某字段的平均值
???如果$condition为数组则根据数组条件返回符合结果的列表
???如果$condition是字串则必须是 where语句之后的字串,亦可通过?和$pam数组组合成SQL语句
???如果不传入条件则根据where方法 的预设参数查询,如果where未被调用过则列出所有 ???
???Parameters:
???string $field 要查询 的字段
???miexd $condition 条件字符串或条件数组 ???miexd $pam 参数数组 ???
???Returns:
???integer 平均值 count
???Model::count(string $field) ???计算行数 ???
???Parameters:
???string $field 统计的参数(*) ???
???Returns: ???integer 计数 delete
???Model::delete(mixed $condition, mixed $pam) ???批量删除数据
???如果不传入条件则自动将这个Model的除id之外的其他字段属性作为条件 ???
???Parameters:
???mixed $condition 条件数组或字串 ???mixed $pam 参数数组 ???
???Returns:
???mixed 删除成功返回删除的条数 失败返回null field
???Model::field(string $select) ???设置查询字段 如:\???
???Parameters:
???string $select 要检索的字段 ???
???Returns:
???Model 模型本身 find
???Model::find(mixed $id, array $pam) ???根据id或者数组条件填充这个model
???示例: find(5) 或 find(array('name'=>'mqq','sex'=>'man')) ???
???Parameters:
???mixed $id 主键或条件数组 ???array $pam 参数值的数组 ???
???Returns:
???Model 模型本身 get_a_clone
???Model::get_a_clone()
???获得一个和此模型一模一样的克隆 ???不克隆ID信息 ???
???Returns:
???Model 新的模型
get_model_array
???Model::get_model_array(string|array $fields) ???获得模型属性信息的数组形式
???只包含数据库中已有的字段 不包含ID信息(特殊$fields指定除外) ???
???Parameters:
???string|array $fields 需要特定指定的字段 ???Returns:
???array 模型的信息数组 get_model_array_with_id
???Model::get_model_array_with_id() ???获得模型属性信息的数组形式
???只包含数据库中已有的字段 包含ID信息 ???
???Returns:
???array 模型的信息数组 has
???Model::has(miexd $condition, miexd $pam) ???查询是否含有符合条件的数据
???如果$condition为数组则根据数组条件返回符合结果的列表
???如果$condition是字串则必须是 where语句之后的字串,亦可通过?和$pam数组组合成SQL语句
???如果不传入条件则根据where方法 的预设参数查询,如果where未被调用过则列出所有 ???
???Parameters:
???miexd $condition 条件字符串或条件数组 ???miexd $pam 参数数组 ???
???Returns: ???boolean has_id
???Model::has_id()
???判断该模型是否含有ID
???查看数据库中是否有独立的一条数据与model对应 ???
???Returns: ???boolean
id
???Model::id(string $id) ???设置这个Model的标识id
???只是设置主键字段,不执行实际的DB查询操作 ???一般在更新或删除之前调用 ???
???Parameters: ???
???string $id 主键 ???Returns:
???Model 模型本身 is_real
???Model::is_real(string|array $fields, boolean $fillme) ???判断当前model是否在数据库中存在真实的对应 ???
???Parameters: ???
???string|array $fields 需要特定指定的字段 ???
???boolean $fillme 是否填充当前model 默认:true ???Returns: ???boolean lable
???Model::lable(string $field) ???获得某一字段的Lable
???默认为数据库中定义的字段注释 ???
???Parameters: ???
???string $field 字段名称 ???Returns:
???string 字段描述 limit
???Model::limit(string $limit) ???设置查询区间 ???
???Parameters: ???
???string $limit 区间 ???Returns:
???Model 模型本身 list_all
???Model::list_all(mixed $condition, array $pam) ???查询并返回模型结果集
???如果$condition为数组则根据数组条件返回符合结果的列表
???如果$condition是字串则必须是 where语句之后的字串,亦可通过?和$pam数组组合成SQL语句
???如果不传入条件则根据where方法 的预设参数查询,如果where未被调用过则列出所有 ???
???Parameters:
???mixed $condition 条件字符串或条件数组 ???array $pam 参数数组 ???
???Returns:
???array Model实体的集合
list_all方法是列表页面展现前,最常用的查询方式 list_all_array
???Model::list_all_array(mixed $condition, array $pam) ???查询并返回数组结果集
???如果$condition为数组则根据数组条件返回符合结果的列表
???如果$condition是字串则必须是 where语句之后的字串,亦可通过?和$pam数组组合成SQL语句
???如果不传入条件则根据where方法 的预设参数查询,如果where未被调用过则列出所有 ???
???Parameters:
???mixed $condition 条件字符串或条件数组 ???array $pam 参数数组 ???
???Returns:
???array 字符下标的数组集合 map_array
???Model::map_array(string $field1, string $field2, array $res_arr) ???将数据表的的两个字段的对应数据转换为键值数组形式 ???
???Parameters:
???string $field1 key ???string $field2 value
???array $res_arr 默认预置数组 ???
???Returns:
???array 键值数组 map_array_kmap
???Model::map_array_kmap(string $field1, array $farray)
???将数据表的的一个字段的值和多个字段的键值对对应的数据转换为键值数组-Map的形式 ???
???Parameters: ???
???string $field1 key ???
???array $farray 要填充到Map的Array(二级键值) ???Returns:
???array 一键多值数组 max
???Model::max(string $field, miexd $condition, miexd $pam) ???查询并返回某字段的最大值
???如果$condition为数组则根据数组条件返回符合结果的列表
???如果$condition是字串则必须是 where语句之后的字串,亦可通过?和$pam数组组合成SQL语句
???如果不传入条件则根据where方法的预设参数查询,如果where未被调用过则列出所有 ???
???Parameters:
???string $field 要查询 的字段
???miexd $condition 条件字符串或条件数组 ???miexd $pam 参数数组 ???
???Returns:
???integer 最大值 min
???Model::min(string $field, miexd $condition, miexd $pam) ???查询并返回某字段的最小值
???如果$condition为数组则根据数组条件返回符合结果的列表
???如果$condition是字串则必须是 where语句之后的字串,亦可通过?和$pam数组组合成SQL语句
???如果不传入条件则根据where方法 的预设参数查询,如果where未被调用过则列出所有 ???
???Parameters:
???string $field 要查询 的字段
???miexd $condition 条件字符串或条件数组 ???miexd $pam 参数数组 ???
???Returns:
???integer 最小值 order
???Model::order(string $order) ???设置查询排序 ???
???Parameters: ???
???string $order 排序 ???Returns:
???Model 模型本身 remove
???Model::remove() ???删除本条信息 ???
???Returns:
???mixed 删除成功返回 1 失败返回null save
???Model::save() ???保存或更新此条信息 ???
???Returns: ???mixed
???验证失败返回false ???存储失败返回null ???存储成功返回本身 sum
???Model::sum(string $field) ???计算某一字段的和 ???
???Parameters:
???string $field 参数数组 ???
???Returns: ???integer 计数 type
???Model::type(string $field) ???获得某一字段的数据类型 ???
???Parameters:
???string $field 字段名称 ???
???Returns:
???string 字段描述 update
???Model::update(array $condition, array $data)
???批量更新信息如果不传入数据$data且存在id则$condition相当于$data并依据ID进行$condition数据更新
???如果不传入数据$data且不存在id自动将这个Model的除id之外的其他字段属性作为更新数据 ???
???Parameters:
???array $condition 条件数组 ???array $data 更新的数据数组 ???
???Returns:
???boolean 是否更新成功 where
???Model::where(mixed $condition, array $pam) ???传入要查询的条件 ???
???Parameters:
???mixed $condition 条件字符串或条件数组 ???array $pam 参数值的数组 ???
???Returns:
正在阅读:
YYUC开发手册(某微信平台开发框架)05-04
小学语文教师晋升中级职称述职报告02-25
百岁老人写给时间的抗议书450字07-01
解决win7系统不能使用网银的问题12-24
木头人游戏作文400字07-06
安徽省历年中考物理试卷及答案-(2007-2016)05-22
坚持群众路线是兴国的必经之路06-26
易班品牌建设策划案-站务部03-28
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 开发
- 框架
- 手册
- 平台
- YYUC
- 最简单的基于AT89C2051单片机超声波测距系统设计报告
- 万向传动轴设计说明书
- 写作指导论文高中议论文的写作指导论文
- 中外教育理念及其家长必备知识
- 质量、进度、投资控制措施
- Java基础性实验报告
- 汽车通用化设计对汽车总装工艺的影响
- 第二届大学生职业生涯规划大赛参赛指南 - 图文
- 永磁同步电动机系统原理
- 第6章 中央银行
- 6LoWPAN调研报告 V4 - 图文
- 自动控制原理期末试卷与答案
- 2018年福建省中考英语试卷(A卷)含答案
- 贵州安顺市2012-2013年中国煤制品行业可行性研究报告
- 《化工原理实验指导书》(201212生物工程专业用)(1)
- 计算机网络_第四章习题
- 高中数学课课练5.答案
- 2011江苏会计从业资格考试会计基础模式试卷试题及答案
- 冲压工艺期末试题
- 超声波测距应用