YYUC开发手册

更新时间:2024-06-21 19:33: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 内容如下:

??? ??? ??? ???

???CRUD测试-列表 ??? ??? ??? ??? ???

???{$note->lable('title')} ???{$note->lable('author')} ???{$note->lable('theme')} ???{$note->lable('postdate')} ???

???{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 内容如下:

??? ??? ??? ???

???CRUD测试-详细信息 ??? ??? ???

??? ??? ???

浏览器输入:http://www.yyuc.net/notes/show-1.html

信息删除

修改列表展示页面,让每条信息点击后进入相应的详细页面,并添加删除按钮和编辑按钮。

index.html 内容改为:

??? ??? ??? ???

???CRUD测试-列表 ??? ??? ???

??? ??? ???

浏览器输入:http://www.yyuc.net/notes/edit-1.html , 进行相应的数据修改,点击\提交”,此条信息就会被更新。

你会发现edit.html和creat.html基本一致,有以下两处不同:

1、creat.html的 form的action为空这样默认是当前页面,也就是creat.html。

而同样的edit.html的form的action也为 creat.html。也就是说两个页面提交的信息都是通过creat.php处理的。$note->save();既可以新增,也可以更新,框架 是通过判断模型中是否定义了主键ID来区分的。

2、edit.html比creat.html多了一行代码{$note->hidden('id')}这是隐藏的数据的主键id的提交 信息。其实在creat.html中也是可以加上{$note->hidden('id')}这句的,因为进入视图creat.html之 前$note的id并未被赋值,自然提交请求之后,控制器还是会新增一条数据的。 这样两个视图就变的一模一样。

索性,我们删掉creat.html。然后将creat.php的代码改为: ???

???$note = new Model('notes'); ???if(Request::post()){

???//如果有post信息 则为新增后的Form提交 ???$note->load_from_post(); ???$note->save();

???Redirect::to('index'); ???}

???Page::view('edit'); ????>

Page::view('edit')的意思是说,这个控制器的视图改为同级目录下的edit.html。

不过,实际的开发中,两个视图总会有些差别的,所以为了减少代码量和通用性就需要将通用的部分抽离出来作为单独的模板供其他视图引用。

视图模板的引用

读到这里你会发现所有页面并没有导航条,这样只能靠直接输入地址栏或者回退按钮来做页面跳转,让我来做一个通用的导航条模板让所有视图都引用他,这样各页面的跳转就容易多了。 创建视图文件:view/default/notes/navigation.html 对应导航条视图。 navigation.html内容如下:

???

???| ???|

??? ??? ???

在所有视图文件的”body”标签下方都引入此视图,引用代码是: ???{T navigation}

这样所有页面之前就跳转自如了。 详细了解各种路径的引用方式请参阅视图引用的说明。

分页功能的实现

YY框架的分页原理借鉴了Rails框架的kaminari插件,即方便调用又不失个性化。详细的调用规则请参见分页类的API。下面做一个简单的分页展示。 index.php 内容修改如下:

???

???$note = new Model('notes');

???$pagination = new Pagination(8, 7);

???$notes = $pagination->model_list($note); ????>

Pagination(8, 7)的构造方法的意思是每页显示8条记录,每页允许出现的最多分页页面的链接数为7。

model_list方法传入要被分页的模型,模型将查询的工作交由分页控制类执行。 index.html 内容修改如下:

??? ??? ??? ???

???CRUD测试-列表 ???