基础
- 官方手册
- Yaf是一个C语言编写的PHP框架
- 依赖SPL和PCRE扩展,一般PHP默认启用
优点
- 性能开销小
- 框架类在启动PHP时加载,常驻内存
- 高性能的视图引擎
- 可自定义视图引擎,支持插件,支持自定义路由
Hello World
结构
+ public
|- index.php //入口文件
|- .htaccess //重写规则
|+ css
|+ img
|+ js
+ conf
|- application.ini //配置文件
+ application
|- Bootstrap.php
|+ controllers
|- Index.php //默认控制器
|+ views
|+ index //控制器
|- index.phtml //默认视图
|+ modules //其他模块
|+ library //本地类库
|+ models //model目录
|+ plugins //插件目录
入口文件
<?php
define("APP_PATH", realpath(dirname(__FILE__) . '/../')); /* 指向public的上一级 */
$app = new Yaf_Application(APP_PATH . "/conf/application.ini");
$app
->bootstrap()// 可选
->run();
重写规则
- 每种server都要特别设置重写规则
- 重写所有请求到入口文件
- nginx为例
server {
listen ****;
server_name domain.com;
root document_root;
index index.php index.html index.htm;
if (!-e $request_filename) {
rewrite ^/(.*) /index.php/$1 last;
}
}
配置文件
- 可以直接使用php中已定义的常量
- 配置文件支持继承, 支持分节
- 默认节是product
[product]
application.directory=APP_PATH "/application/"
引导程序
- yaf提供的一个全局配置的入口, 可以做很多全局自定义的工作
class Bootstrap extends Yaf_Bootstrap_Abstract{
}
默认控制器
- 默认控制器为IndexController
- 默认Action为IndexAction
<?php
class IndexController extends Yaf_Controller_Abstract {
public function indexAction() {//默认Action
$this->getView()->assign("content", "Hello World");
}
}
默认视图文件
- yaf支持简单的视图引擎
- 默认视图文件为views/index/index.phtml
<html>
<head>
<title>Hello World</title>
</head>
<body>
<?php echo $content;?>
</body>
</html>
Bootstrap
- Bootstrap类中, 所有以_init开头的方法, 都会被Yaf按申明次序自动调用
- 这些方法, 都可接受一个参数:Yaf_Dispatcher $dispatcher
- erp中在这里进行用户登录状态校验、注册特殊规则的路由
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_Plugin_Abstract
- 定以后需要向Yaf_Dispatcher注册,所以一般插件注册都放在Bootstrap中进行
路由
- 路由负责解析请求,交给指定的module/controller/action处理
- 路由规则可以自定义
- 路由组件有两个部分:路由器(Yaf_Router)和路由协议(Yaf_Route_Abstract)
- 路由器负责管理和运行路由链
- 路由协议负责匹配预先定义好的规则
- 路由器根据路由协议栈倒叙遍历路由协议,匹配则成功,即后注册的协议会先被匹配
- 路由将解析得到的信息传递给请求对象(Yaf_Request_Abstract)
- 信息包括moduel、controller、action、用户params等
- 派遣器(Yaf_Dispatcher)就会按照这些信息派遣正确的控制器动作
- 默认路由器是Yaf_Router
- 默认路由协议是Yaf_Route_Static
- 默认请求对象Yaf_Request_Http
默认路由协议
- 默认的路由协议为Yaf_Route_Static
- 根据"/"对request_uri分段, 依次得到Module,Controller,Action
- 根据Yaf_Application::$modules来判断Module是否合法,若不合法则把原Module当做Controller, 原Controller当做Action
/**
* 对于请求request_uri为"/ap/foo/bar/dummy/1"
* base_uri为"/ap"
* 则最后参加路由的request_uri为"/foo/bar/dummy/1"
* 然后, 通过对URL分段, 得到如下分节
* foo, bar, dummy, 1
* 然后判断foo是不是一个合法的Module, 如果不是, 则认为结果如下:
*/
array(
'module' => '默认模块',
'controller' => 'foo',
'action' => 'bar',
'params' => array(
'dummy' => 1,
)
)
/**
* 而如果在配置文件中定义了ap.modules="Index,Foo",
* 则此处就会认为foo是一个合法模块, 则结果如下
*/
array(
'module' => 'foo',
'controller' => 'bar',
'action' => 'dummy',
'params' => array(
1 => NULL,
)
)
其他路由协议
- Yaf_Route_Simple
- Yaf_Route_Supervar
- Yaf_Route_Map
- Yaf_Route_Rewrite
- Yaf_Route_Regex
// 用正则匹配路由,交给指定的控制器动作处理
$route = new Yaf_Route_Regex(
'product/(.*)/(.*)',
[
'controller' => 'products',
'action' => 'view'
],
[
1 => 'foo',
2 => 'bar',
]
);
// 正则匹配部分可以利用正则的反向引用,从缓冲区读取为参数
// 控制器中获取参数
$foo = $this->getRequest()->getParam('foo');
$bar = $this->getRequest()->getParam('bar');
- 自定义路由协议:实现Yaf_Route_Interface接口
添加路由协议
//通过派遣器得到默认的路由器
$router = Yaf_Dispatcher::getInstance()->getRouter();
$router->addRoute('myRoute', $route);
内建类
Yaf_Application
- Yaf_Application代表一个产品/项目, 是Yaf运行的主导者, 真正执行的主体.
- 负责接收请求, 协调路由, 分发, 执行, 输出
- final,单例
Yaf_Bootstrap_Abstract
- 引导程序,用来定制Yaf_Application
- 用户可继承并任意添加方法,其中以_init开头的方法都会在Yaf_Application::Bootstrap()时自动执行
- 所有_init方法都可以接受一个Yaf_Dispatcher对象作为参数
Yaf_Registry
- 对象注册表(或称对象仓库),相当于一种全局存储
- 是用于在整个应用空间(application space)内存储对象和值的容器
- 该类是一个数组对象,你可以使用数组形式来访问其中的类方法
- 主要方法
- Yaf_Registry::set(string $name,mixed $value):Yaf_Registry
- Yaf_Registry::get(string $name):mix/false
- Yaf_Registry::has(string $name):bool
- Yaf_Registry::del(string $name):bool
Yaf_Config_Abstract
$config = Yaf_Application::app()->getConfig();
$host = $config->db->host;// 对象形式
$host = $cofig['db']['host'];// 数组形式
Yaf_Controller_Abstract
- 控制器基类,用户自定义的控制器类需继承该抽象类
- 一个自定义的控制器类可以包含多个Action方法,Action方法是路由的最终执行者
- Action方法可以定义参数,路由器将尝试将路由参数赋值给同名的方法参数
// http://domain.com/index/index/name/a/value/2
public function indexAction($name, $value) {
//直接获取参数;
echo $name;// a
echo $value; // 2
}
- 主要方法
- Yaf_Controller_Abstract::getModuleName():string/null
- Yaf_Controller_Abstract::getRequest():Yaf_Request_Abstract
- Yaf_Controller_Abstract::getResponse():Yaf_Response_Abstract
- Yaf_Controller_Abstract::initView():Yaf_View_Interface//初始化视图引擎
- Yaf_Controller_Abstract::getView():Yaf_View_Interface
- Yaf_Controller_Abstract::setViewPath(string $view_directory):Yaf_Controller_Abstract/false // 设置视图模板目录
- Yaf_Controller_Abstract::getViewPath():string/null
- Yaf_Controller_Abstract::render(string $action,array $tpl_vars=null):Yaf_Response_Abstract // 渲染视图,返回渲染结果
- Yaf_Controller_Abstract::display(string $action,array $tpl_vars=null):bool //渲染视图并直接输出渲染结果
- Yaf_Controller_Abstract::forward(…):Yaf_Controller_Abstract/false // 将当前请求转给另外一个action处理(本action还是要执行完毕的)
- Yaf_Controller_Abstract::redirect(string $url):Yaf_Controller_Abstract/false // 重定向请求到新的路径
Yaf_Action_Abstract
- 为了使得代码清晰, 分离一些大的控制器, action可以采用单独定义Yaf_Action_Abstract来实现
- 包含一个抽象方法execute()
// 在Controller类中添加属性
public $actions = [
"index" => "actions/Index.php",
];
// 则index动作将交由actions/Index类处理,执行其中的execute方法
// actions/Index.php中
class IndexAction extends Yaf_Action_Abstract{
public function excute(){}
}
Yaf_View_Interface
- 视图引擎接口
- 接口方法
- Yaf_View_Interface::__set — 为视图引擎分配一个模板变量
- Yaf_View_Interface::__get — 获取视图引擎的一个模板变量值
- Yaf_View_Interface::assign — 为视图引擎分配一个模板变量
- Yaf_View_Interface::display — 渲染一个视图模板, 并直接输出给请求端
- Yaf_View_Interface::render — 渲染一个视图模板,返回结果
- Yaf_View_Interface::getScriptPath — 获取当前的模板目录
- Yaf_View_Interface::setScriptPath — 设置模板的基目录,默认APPLICATION_PATH . “/views”
- 模板中通过
n
a
m
e
或
name或
name或this->_tpl_vars[$name]获取模板变量值
- Yaf_View_Simple自带的视图引擎,模板为普通的php脚本
Yaf_Request_Abstract
- 代表了一个实际请求,Yaf_Application在run以后会自动根据当前请求实例它
- 主要方法
- Yaf_Request_Abstract::getEnv — 取得ENV变量的值
- Yaf_Request_Abstract::getLanguage — The getLanguage purpose
- Yaf_Request_Abstract::getServer — 返回SERVER变量的值
- Yaf_Request_Abstract::getBaseUri — The getBaseUri purpose
- Yaf_Request_Abstract::getRequestUri — The getRequestUri purpose
- Yaf_Request_Abstract::getModuleName — The getModuleName purpose
- Yaf_Request_Abstract::getControllerName — The getControllerName purpose
- Yaf_Request_Abstract::getActionName — The getActionName purpose
- Yaf_Request_Abstract::getParam — The getParam purpose
- Yaf_Request_Abstract::getParams — The getParams purpose
- Yaf_Request_Abstract::getException — The getException purpose
- Yaf_Request_Abstract::isCli — The isCli purpose
- Yaf_Request_Abstract::isDispatched — The isDispatched purpose
- Yaf_Request_Abstract::isRouted — The isRouted purpose
- Yaf_Request_Abstract::getMethod — The getMethod purpose
- Yaf_Request_Abstract::isGet — The isGet purpose
- Yaf_Request_Abstract::isPost — The isPost purpose
- Yaf_Request_Abstract::isPut — The isPut purpose
- Yaf_Request_Abstract::isHead — The isHead purpose
- Yaf_Request_Abstract::isOptions — The isOptions purpose
- Yaf_Request_Abstract::isXmlHttpRequest — The isXmlHttpRequest purpose
- Yaf_Request_Abstract::setBaseUri — The setBaseUri purpose
- Yaf_Request_Abstract::setRequestUri — The setRequestUri purpose
- Yaf_Request_Abstract::setModuleName — The setModuleName purpose
- Yaf_Request_Abstract::setControllerName — The setControllerName purpose
- Yaf_Request_Abstract::setActionName — The setActionName purpose
- Yaf_Request_Abstract::setParam — The setParam purpose
- Yaf_Request_Abstract::setDispatched — The setDispatched purpose
- Yaf_Request_Abstract::setRouted — The setRouted purpose
- Yaf_Request_Http处理http请求
- Yaf_Request_Simple处理请求
Yaf_Response_Abstract
- 响应对象
- 主要方法
- Yaf_Response_Abstract::__construct — The __construct purpose
- Yaf_Response_Abstract::__clone — The __clone purpose
- Yaf_Response_Abstract::__destruct — The __destruct purpose
- Yaf_Response_Abstract::__toString — The __toString purpose
- Yaf_Response_Abstract::setBody — 设置响应的Body
- Yaf_Response_Abstract::appendBody — 往已有的响应body后附加新的内容
- Yaf_Response_Abstract::prependBody — 往已有的响应body前插入新的内容
- Yaf_Response_Abstract::getBody — 获取已经设置的响应body
- Yaf_Response_Abstract::clearBody — 清除已经设置的响应body
- Yaf_Response_Abstract::clearHeaders — The clearHeaders purpose
- Yaf_Response_Abstract::setAllHeaders — The setAllHeaders purpose
- Yaf_Response_Abstract::setHeader — The setHeader purpose
- Yaf_Response_Abstract::getHeader — The getHeader purpose
- Yaf_Response_Abstract::response — send response
- Yaf_Response_Abstract::setRedirect — The setRedirect purpose
- Yaf_Response_Http Web响应
- Yaf_Response_Cli 命令行响应
Yaf_Router
- 路由器,负责分析请求中的request uri, 得出目标模板, 控制器, 动作
- 主要方法
- Yaf_Router::__construct — Yaf_Router constructor
- Yaf_Router::addConfig — 向Router中添加配置文件中定义的路由
- Yaf_Router::addRoute — 往Router中添加新的路由
- Yaf_Router::getCurrentRoute — 在路由结束以后, 获取路由匹配成功, 路由生效的路由协议名
- Yaf_Router::getRoute — 获取当前路由器的路由协议栈中名为$name的协议
- Yaf_Router::getRoutes — 获取当前路由器中的所有路由协议
- Yaf_Router::route — 路由一个请求, 本方法不需要主动调用, Yaf_Dispatcher::dispatch会自动调用本方法
Yaf_Route_Interface
Yaf_Loader
Yaf_Dispatcher
- 协调路由来的请求, 并分发和执行发现的动作, 并收集动作产生的响应, 输出响应给请求者, 并在整个过程完成以后返回响应
- 它由Yaf_Application负责初始化, 然后由Yaf_Application::run启动
Yaf_Session
- 用来操作session
- 实现了Iterator, ArrayAccess, Countable接口
Yaf_Exception
- 处理异常, 继承自Exception, 并实现了异常链