写在前面
鸟哥是谁?
注意:也是PHP核心开发者之一(目前的最新的PHP7参与其中,并且很大部分的代码都是他贡献的)。和之前Linux私房菜鸟哥不是同一个人(这个鸟哥是台湾,主要是做Linux教程。)但我们yaf的鸟哥是惠新宸(风雪之隅)(之前是在百度工作的时候网名叫做雪候鸟,年龄相对大一点,所以被称为鸟哥。也在新浪微博工作。目前应该是在链家做架构师)
相关报道:
http://www.infoq.com/cn/articles/weibo-architect-on-php-development
yaf是什么?
注意:yaf框架是使用C语言进行编写的,编程之后编程成一个dll文件作为PHP的扩展进行出现,当PHP引入该扩展后,就在PHP里面内置很多的类库。然后我们就可以直接调用这些类库(等价PHP里面内置的一些功能,例如内置的函数、stdClass内置标准类),注意:同类型的框架还有国外的phalcon框架,也是做为PHP的出现,也是一个高性能的扩展,这类框架的性能折损非常少,性能仅次于原生的PHP。看一下官方的简介:
相关资源
yaf手册:http://yaf.laruence.com/
github地址:https://github.com/laruence/yaf
yaf安装
dll扩展下载
yaf框架是作为PHP的一个扩展存在的,所以我们需要去下载对应的扩展文件,然后在php.ini文件引入即可。
扩展下载地址:
http://pecl.php.net/package/yaf
这里我们假设使用的朋友都是使用的windows操作系统,点击DLL下载即可,这里我们一2.3.5为例。接下来我们来到具体的下载页面:
版本新的的选择需要严格的依赖phpinfo函数给出的信息
PHP-ext引入
将下载后的php_yaf.dll文件复制到PHP的ext扩展目录即可
php.ini配置文件
最后在php.ini文件最后面中引入如下一段即可:
[yaf]
extension=php_yaf.dll
yaf.environ=product
重复apache后,使用phpinfo函数见到如下信息即代表扩展配置成功。
注意:当我们把PHP的yaf扩展引入后,PHP内部就会存在很多的yaf提供的类库,但是yaf官方并没有给出yaf框架的目录文件等信息,但是提供一个官方的建议:yaf框架的目录的组织结构应该如何实现。
yaf快速入门
项目目录结构
在成功安装扩展后,我们就可以使用yaf进行开发,但是在开发之前,我们需要规划一个项目开发目录。
当让我们也可以使用官方提供的代码生成工具进行自动生成:
http://www.laruence.com/manual/tutorial.last.html
官方的建议目录如下:
application
│ │ Bootstrap.php
│ ├─common
│ │ functions.php
│ ├─controllers
│ │ Index.php
│ ├─library
│ ├─models
│ │ │ User.php
│ │ │
│ │ └─Db
│ │ Medoo.php
│ ├─modules
│ │ └─Admin
│ │ ├─controllers
│ │ │ Back.php
│ │ └─views
│ ├─plugins
│ └─views
│ └─index
│ index.phtml
├─conf
│ application.ini
│
└─public
index.php
虚拟主机配置
需要注意的是,项目的入口文件是放在public目录下的,则我们建立的项目的虚拟主机的目录应该是指定到public目录。一个示例的虚拟主机的配置如下:
<VirtualHost *:80>
DocumentRoot “C:\phpStudy\WWW\yaf.dev\public”
ServerName yaf.dev
ServerAlias
<Directory “C:\phpStudy\WWW\yaf.dev\public”>
Options Indexes FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
</VirtualHost>
入口文件编写
在public目录的index.php文件的内容如下:
需要注意的是,只需要在该文件定义一个常量,然后实例化Yaf_application(),同时传递一个配置文件即可。
<?php
define(“APPLICATION_PATH”, realpath(dirname(__FILE__) . ‘/../’));
define(“APPLICATION_COINFIG_FILE”,APPLICATION_PATH . “/conf/application.ini”);
date_default_timezone_set(‘Asia/Shanghai’);
$app = new Yaf_Application(APPLICATION_COINFIG_FILE);
$app->bootstrap()->run();
配置文件
在config目录的application.ini文件里面只需要定义如下的配置内容即可。
[product]
;分号代表注释,支持直接写PHP中的已定义常量
application.directory=APPLICATION_PATH “/application/”
通过刚才的手工目录创建和yaf官方提供的代码生成器的创建,我们发现目录创建还是比较繁琐不适合入门的人去捯饬,那我们可以使用默认的目录结构来进行学习。
composer管理
简介
网站:https://packagist.org/packages/gogery/yaf
- 使用命令创建本地项目 local.yaf.com
> composer create-project gogery/yaf local.yaf.com
- 生成目录结构
- 配置虚拟主机
<VirtualHost *:80>
DocumentRoot “C:\phpStudy\WWW\local.yaf.com\public”
ServerName local.yaf.com
ServerAlias
<Directory “C:\phpStudy\WWW\local.yaf.com\public”>
Options FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
</VirtualHost>
- 浏览器访问效果
建议大家直接使用composer进行目录的管理。
IDE配置
注意:yaf框架扩展的引入,在使用的时候内置了很多的类文件,如果没有一个IDE进行代码的提示,我们是很难记得住到底存在哪些类,哪些方法,则我们可以为IDE配置一下代码提示。yaf代码提示的插件。
网站:https://github.com/elad-yosifon/php-yaf-doc
- 插件解压
- 配置phpstorm的插件目录
配置插件的目录
目录结构以及插件都安装完成后,则可以正式的学习yaf框架(yaf框架也是一个单一入口 + MVC架构)。
学习框架主要是从如下几个方面进行学习:(MVC CVM)
- 学习控制器
- 学习视图
- 学习模型(但是需要注意的,yaf框架本身是没有提供模型,这个需要用户自己去完成,因为作者觉得pdo已经是一个很好的操作数据库的工具,没必要在写一个,我们会单独的学习一个第三方的模型类 Medoo)
- 配置文件
- …..
控制器-constrollers
经过上面的操作,基本的目录结构已经搭建完毕,接下来我们完成我们的第一个控制器的编写。在正式编写控制器之前,我们只要弄清楚如下几个问题,即可快速掌握控制器的使用。
- 控制器写在哪里?
- 控制器的文件如何命名?
- 控制器里面的内容如何编写?
- 控制器里面的方法如何命名?
- 控制器里面如何载入视图?
- 控制器里面如何给视图赋值?
- 如何在视图里面显示控制器的赋值变量?
实操:
- 控制器写在哪里?(application/controllers目录)
- 控制器的文件如何命名?
- 控制器里面的内容如何编写?
- 控制器里面的方法如何命名?
- 控制器里面如何载入视图?
视图创建
效果
- 控制器里面如何给视图赋值?
- 如何在视图里面显示控制器的赋值变量?(直接使用原生的PHP输出、yaf内置的模板引擎只支持原生的PHP语法)
效果
视图-views
视图主要是用户来展示数据和收集用户的数据。
在正式学习视图之前,我们先思考如下几个问题:
1. 视图文件写在哪里?
2. 视图文件如何命名?
3. 如何在控制器里面调用视图,如何获取视图里面的内容?
4. 在控制器里面如何给视图赋值?
5. 如何在视图里面显示控制器的赋值变量?
实操:
- 视图文件写在哪里?(注意:需要注意是存在模块,如果有模块,则写在模块的对应的views目录,没有则写在application/views/目录下)
- 视图文件如何命名?
答:文件的命名满足和方法同名,并且后缀是 phtml
- 如何在控制器里面调用视图,如何获取视图里面的内容?
答:yaf框架默认会自动载入视图
如果终止return false 或者 Yaf_Dispatcher::getInstance()->disableView();
- 在控制器里面如何给视图赋值?
答:$this->getView()->assign(‘视图调用名称’, $变量名称)
- 如何在视图里面显示控制器的赋值变量?
答:原生的PHP
注意:Yaf_View_Simple 常见方法使用:
yaf模型-models
注意
需要注意的是yaf框架并没有提供模型类,这个需要用户自己去实现,我们可以自己封装一个模型,也可以使用被人提供好的模型类文件,例如如下的一个模型类:
相关文档:http://medoo.lvtao.net/doc.php
Medoo基本使用
- 下载
- 引入
- 实例化(进行数据库配置)
实操:
具体代码参考
模型命名
注意:yaf框架并没有模型类,但是规定了模型的书写的规则以及加载的实现。
命名、实例化如何加载。
例如:我们打算在application/models/目录下创建一个Goods.php类文件,则类名应该如下:
通过上面的操作我们可以很方面的完成模型类的定义,当我们定义好了之后,直接在控制器里面进行实例化即可,yaf框架会自动进行类的载入。
问题:通过上面的操作定义的模型类是直接在application/models目录下定义的,如果现在我们需要在该目录下在建立子目录,然后在子目录里面定义模型,则模型的类名该如何定义?
总结:在yaf里面模型的命名是通过下划线来查找类的目录结构。
yaf模块化-modules
配置
注意:yaf框架默认的目录结构里面使用的Index模块,如果我们需要进行其他的模块的创建,例如配置后台Admin模块,Member模块。则我们需要在application.ini里面进行配置,然后在application/modules/目录创建对应的模块目录,模块目录下创建对应的controllers目录和views目录。
假如我们要新增加一个Member模块用来做后台管理(需要注意的是如果我们使用模块功能,则必须加上Index模块)。则我们需要在application.ini的某个节里面配置如下信息:
application.modules = “Index,Member”
新建模块
需要注意的是:其中Admin目录就和配置的模块名称一致,每个模块目录下都可以新建controllers和views目录用作控制器和视图,但是模块下的models内的文件不支持自动载入,所以在该模块下的一些业务方法只能放在application/models目录下。
模块里面的控制器和视图同上面的控制器的使用一致。
访问
小写URL访问:
域名/index.php/模块名称/控制器名称/方法名称
yaf表单-Yaf_Request_Http
简介
在前后台进行交互的过程中,后端程序不可避免的需要接收用户提交的数据,常见的数据有
- get提交数据
- post提交数据
- 上传文件数据
- get查询字符串
- cookie数据等等
数据接收
在控制器里面我们可以通过$this->getRequest()来进行数据的接收,该方法返回的是Yaf_Request_Http的实例。
yaf之session-Yaf_Session
简介
由于http请求是无状态的,则在页面交互的过程中,有的时候我们需要跨脚本共享数据,则我们可以使用cookie或者session进行处理,session相对来说更加的安全,yaf框架内置了一个session处理类,可以非常方便的帮助我们进行session的处理。
使用
Yaf_Session::getInstance()->get(‘name’)
yaf配置篇-Yaf_Config_Ini
简介
配置文件基本可以说是每个项目都会有,在配置文件中我们通常会配置数据库访问地址、redis连接、url地址等等。
yaf对于配置文件的解析提供了节(section)的支持,并且还支持节之间的继承功能,将节的设置和yaf运行环境(yaf.environ)结合起来就可以达到很好的配置效果,且看如何实现。
php.ini配置
在配置php支持yaf的时候,可以设置一个参数yaf.environ:把本地开发设置成develop、测试环境配置成test、生产环境配置成product,如:
application.ini文件配置
yaf配置文件一般都放在项目的conf文件夹下。Yaf _Application实例化的时候需要传递一个配置文件路径,假设我们的配置文件叫application.ini,先看下application.ini的结构:
[common]
; 通用配置,数据库配置
resources.database.params.driver = “pdo_mysql”
resources.database.params.hostname = “127.0.0.1”
resources.database.params.port = 3306
resources.database.params.database = “database”
resources.database.params.username = “username”
resources.database.params.password = “password”
[product : common]
; 生产环境配置,这里的配置除了节之外,节和节之间还有继承关系。例如[product : common]就表示product的配置会继承common的配置。先配置一个数据库连接看看。
[test : common]
; 测试环境配置
[develop : common]
; 开发环境配置
resources.database.params.hostname = “127.0.0.1”
resources.database.params.database = “database”
resources.database.params.username = “username”
resources.database.params.password = “password”
这样当项目运行环境在develop下的时候,会优先读取[develop : common]内的配置,如果没有则会从[common]中获取。在项目中任何地方都可以通过如下的方法获取application.ini里面的配置信息:
Yaf_Application::app()->getConfig();
额外的配置
随着项目越来越庞大,配置也会越来越复杂,如果都放在项目默认的配置文件application.ini中,可能配置会有好几百行,这样就不容易维护了。
一般我们会考虑新建配置文件用来存储额外的配置。yaf中提供了Yaf_Config_Ini类来处理这些额外的配置文件。
$config = new Yaf_Config_Ini( APPLICATION_PATH . ‘/conf/url.ini’, ini_get(‘yaf.environ’) );
类的自动载入机制-libraris
简介
在yaf里面类库的默认目录是application下的library目录,比如我们要写一个Page.php类文件,那么我们需要建立这样的application/library/Page.php类文件。
但是需要注意的是,如果我们需要目录进行嵌套,则类的名称应该是使用下划线进行连接,并且路径的首字母应该大写。
例如:我们打算在application/library/目录下,建议一个Dao目录,然后在该目录下建议一个Mysql目录,并在Mysql目录下建立一个Query.php类文件,则类名应该如下:
class Dao_Mysql_Query{
}
通过这样定义的类,yaf框架则可以根据我们的类名来获取对于的路径,实现对应的自动加载机制。
助手函数扩展-Yaf_Loader
在Bootstrap.php文件定义一个加载助手函数的公共方法,使用Yaf_Loader进行助手函数文件导入。
public function _initCommonFunctions(){
// 加载定义助手函数
Yaf_Loader::import(APPLICATION_PATH . ‘/application/common/functions.php’);
}
响应-Yaf_Response_Abstract
有的时候我们需要进行URL的跳转,则可以使用该类进行响应处理
路由-Yaf_Route-*
简介
yaf框架支持如下五种路由:
- Yaf_Route_Simple
例如:http://local.yaf.com/index.php?m=index&c=index&a=index (普通路由)
- Yaf_Route_Supervar
- Yaf_Route_Static
- Yaf_Route_Rewrite
- Yaf_Route_Regex
例如:http://local.yaf.com/list-12.html
简单路由使用-方式一
创建路由规则的步骤:
- 在Bootstrap.php文件创建一个路由器对象
- 设置路由规则
- 调用路由对象的addRoute方法添加路由规则
public function _initDefineRouter()
{
$router = Yaf_Dispatcher::getInstance()->getRouter();
$mac = new Yaf_Route_Simple(‘m’, ‘c’, ‘a’);
$router->addRoute(‘mac’, $mac);
}
简单路由使用-方式二
- 在application.ini定义路由段
[route]
routes.simple.type=”simple”
routes.simple.module=md
routes.simple.controller=c
routes.simple.action=as
[product:route]
- 在Bootstrap.php里面进行配置注册
public function _initConfig()
{
$config = new Yaf_Config_Ini(APPLICATION_COINFIG_FILE);
Yaf_Registry::set(“config”, $config);
}
public function _initDefineRouter()
{
$router = Yaf_Dispatcher::getInstance()->getRouter();
$router->addConfig( Yaf_Registry::get(‘config’)->route->routes );
}
正则路由-方式一
1. 直接使用正则类进行生成
$router = Yaf_Dispatcher::getInstance()->getRouter();
$route = new Yaf_Route_Regex(
‘#^/product/([a-zA-Z-_0-9]+)$#’,
array(
‘module’ => ‘index’,
‘controller’ => ‘index’,
‘action’ => ‘index’
),
array(
//完成数字到字符变量的映射
1 => ‘ident’
)
);
$router->addRoute(‘reg’, $route);
正则路由-方式二
- 在application.ini定义正则路由段
[route]
routes.regex.type=”regex”
routes.regex.match=”#^/list/([0-9])+\/([a-z0-9]+)$#”
routes.regex.route.module=Index
routes.regex.route.controller=Index
routes.regex.route.action=index
routes.regex.map.1=name
routes.regex.map.2=value
[product:route]
2. 在Bootstrap.php里面进行配置注册
相关学习资料
http://www.phpabc.cn/yaf-kuang-jia-zhi-phpstrom-dai-ma-zi-dong-bu-quan-yaf-ide-auto-complete-2.html
http://www.widuu.com/archives/category/yaf-framework-2
http://www.php1.cn/detail/php-wentis-c817f8fa3d.html
https://segmentfault.com/a/1190000004016373
https://devhub.io/repos/xudianyang-yaf.app
http://www.oss.io/p/xudianyang/yaf.app
案例演示
使用yaf完成一套curd操作,同时做用户的登录和退出,可以理解完成一个后台的用户模块
用户展示
- 定义一个init方法,完成初始化操作
- 定义一个lst方法,完成数据展示
- 定义一个lst.phtml视图文件
效果
用户添加
- 定义一个add方法,完成用户添加
- 定义一个add.phtml视图文件,展示添加表单
效果
用户删除
- 定义一个del方法,完成用户删除
用户编辑
- 定义一个edt方法,完成用户编辑
- 定义一个edt.phtml视图页面,展示待编辑的数据
效果
用户登录
- 定义一个login方法,完成用户的登录处理
用户退出
- 定义一个logout方法,完成用户退出