框架的存在主要意义就是提高程序员的开发效率,同时也带来性能上的一部分损失。
当前开发面向对象已经成为主流,同时为了规范开发使用MVC模式已经成为了一种趋势,当前市面上的框架非常之多,大部分也是MVC模式,但是相对来说对于PHP性能都一定的损失。
那么有没有一种框架既能满足开发效率,又尽可能少的减少性能的损失呢?于是Yaf框架面世。
Yaf是以PHP插件的形式出现,所以少了编译加载等步骤,加强了性能。提供MVC模式,有一定的路由规则,一定的错误处理机制,有一定的触发器。
同时也伴之有不足之处比如说缺少ORM等形式
Yaf的框架搭建的时候目录结构:
public
index.php
.htaccess
css
img
js
conf
application.ini
applciation
controllers
Index.php
views
index
index.phtml
modules
library
models
plugins
Yaf的启动
$app = new Yaf_Application(App_PATH."/CONF/APPLICATION.INI");
$app->run();
配置Yaf的路由规则 开启URL重写
RewriteEngine On
RewriteCond {REQUEST_FILENAME} !-f
RewriteRule .* index.php
server{
listen ***;
server_name domain.com
root document_root;
index index.php index.html index.htm
if(!-erequest_filename){
rewrite ^/(.*) /idnex.php/$1 last;
}
}
SAE下的重写
name:your_app_name
version:1
handle:
-rewrite:if(!is_dir() && !is_file() && path ~ "^(.*)$") goto "/index.php"
输出HelloWorld
<?php
class IndexController extends Yaf_Controller_Abstract{
public function indexAction(){
$this->getView()->assign("content","Hello world");
}
}
?>
[product]
application.driectory = APP_PATH."/application/"
创建demo
yaf_cg sample
配置文件 至少一个application.directory
其他可选:
application.ext php脚本的扩展名
application.bootstrap Bootstrap路径
application.library 类库的绝对目录地址
application.baseUri 在路由中需要忽略的路径前缀
applciation.dispatcher.defaultModule 默认的模块
applciation.dispatcher.throwException 出错的时候抛出异常
applciation.dispatcher.catchException 使用默认的异常捕获Controller
application.dispatcher.defaultController 默认控制器
application.dispatcher.defaultAction 默认动作
appcation.view.ext 视图模板扩展名
appcation.modules 声明存在的模块名,注意如果要定义这个值一定要定义Index Module
application.system.* 通过这个属性,可以修改yaf的runtime configure 比如application.system.lowcase_path,但是请注意只有PHP_INI_ALL的配置项才可以在这里被修改,此选项从2.2.0开始引入
自动加载器
Autoloader 目录映射加载MVC类
非框架MVC类 Yaf支持全局类和自身类的两种加载方式 支持大小写敏感和大小写不敏感两种方式
全局类和自身类(本地类)
全局类:指有产品之间共享的类,这些类库的路径是通过ap.library在php.ini
本地类:产品自身的类库,这些类库的路径是通过在产品的配置文件中,通过ap.library配置的
在yaf中,通过调用Yaf_Loader的regiterLocalNamespace方法,来申明那些类前缀是本地类,即可
类加载规则
下划线分割目录信息,Yaf按照目录信息完成自动加载
$loader = Yaf_Loader::Instance(0);
$loader->registerLocalNamespace(array("Foo","Local"));
Bootstrap 引导程序 提供一个全局配置的入口
$app = new Yaf_Application("conf.ini");
$app->bootstrap()->run();
// _init开头
//这些方法都接受一个参数:Yaf_Dispatcher $dispatcher
//调用顺序按照声明顺序
class Bootstrap extends Yaf_Bootstrap_Abstract{
public function _initConfig(){
$config = Yaf_Application::app()->getConfig();
Yaf_Registry::set("config",$config);
}
public function _initDefaultName(Yaf_Dispatcher $dispatcher){
$dispatcher->setDefaultModule("Index")->setDefaultController("Index")->setDefaultAction("Index");
}
}
Yaf支持的Hook
routerStartup
routerShutdown
dispatchLoopStartup
preDispatch
posDispatch
dispatchLoopShutdown
自定义插件(可接受两个参数 Yaf_Request_Abstract 和 Yaf_Response_Abstract)
<?php
class UserPlugin extends Yaf_Plugin_Abstract{
public function routerStartup(Yaf_Request_Abstract request,Yaf_Response_Abstractresponse){}
public function routerShutdown(Yaf_Request_Abstract request,Yaf_Response_Abstractresponse){}
}
Yaf插件 必须继承自Yaf_Plugin_Abstract plugins目录
路由和路由协议
路由组件有两个部分:路由器(Yaf_Router)和路由协议(Yaf_Route_Abstract).
路由注册的顺序很重要,最后注册的路由协议,最先尝试路由,这就有个陷阱,请注意。
默认情况下路由器是Yaf_Router 默认路由协议 Yaf_Route_Static 基于Http路由的,他期望一个请求时Http请求并且请求对象是使用yaf_Request_Http
<?php
//路由器实例
router = Yaf_Dispatcher::getInstance()->getRouter();
//路由器协议router->addRoute('myRoute',route);
在配置文件中定义:
[common]
;自定义路由 顺序很重要
routes.regex.type= "regex"
routes.regex.match =
routes.regex.route.controller = Index
routes.regex.route.action = action
routes.regex.map.1 = name
routes.regex.map.2 = value
;添加一个名为simple的路由协议
routes.simple.type="simple"
routes.simple.controller = c
routes.simple.module = m
routes.simple.action = a
;添加一个名为supervar的路由协议
routes.supervar.type = "supervar"
routes.supervar.varname = r
[product:common]
;product节是Yaf默认关心的节,添加一个名为rewrite的路由协议
routes.rewrite.type = "rewrite"
routes.rewrite.match = "/product/:name/:value"
<?php
class Bootstrap extends Yaf_Bootstrap_Abstract{
public function _initRoute(Yaf_Dispatcherdispatcher){
router = Yaf_Dispatcher::getInstance()->getRouter();
//添加配置中的路由router->addConfig(Yaf_Registry::get("config")->routes);
}
}
//其实路由器也提供给我们不同的方法来得到和设置包含在它内部的信息,一些重要的方法如下:
getCurrentRoute() //在路由结束以后, 获取起作用的路由协议
getRoute(), getRoutes();//看函数基本意思也就知道.
自定义路由器:申明你的路由协议实现了Yaf_Route_Interface接口即可
异常和错误
application.dispatcher.throwException 打开的情况下 会抛异常,否则会触发错误
<?php
class ErrorController extends Yaf_Controller_Abstract{
publi function errorAction(exception){
//NO1.
assert(exception === exception->getCode());this->getView()->assign("code",exceptioon->getCode());this->getView()->assign("message",exception->getMessage());
//NO.2exception = this->getRequest()->getException();
try {
throwexception;
} catch (Yaf_Exception_LoadFailed e) {
//加载失败
} catch (Yaf_Exceptione) {
//其他错误
}
}
}