预定义常量

YAF_VERSION (string)
YAF_ENVIRON (string)
YAF_ERR_STARTUP_FAILED (integer)
YAF_ERR_ROUTE_FAILED (integer)
YAF_ERR_DISPATCH_FAILED (integer)
YAF_ERR_AUTOLOAD_FAILED (integer)
YAF_ERR_NOTFOUND_MODULE (integer)
YAF_ERR_NOTFOUND_CONTROLLER (integer)
YAF_ERR_NOTFOUND_ACTION (integer)
YAF_ERR_NOTFOUND_VIEW (integer)
YAF_ERR_CALL_FAILED (integer)
YAF_ERR_TYPE_ERROR (integer)

运行时配置

这些函数的行为受 php.ini 中的设置影响。

名字 默认 可修改范围 说明
yaf.library PHP_INI_ALL 全局库路径,Yaf_loader将在此目录中搜索全局库。
yaf.action_prefer 0 PHP_INI_ALL 当uri只有一段,如/post, 开启后,把post当作action,否则当作controller
yaf.lowcase_path 0 PHP_INI_ALL 是否在类自动加载期间小写所有路径。
yaf.use_spl_autoload 0 PHP_INI_ALL 开启的情况下, Yaf在加载不成功的情况下, 会继续让PHP的自动加载函数加载, 从性能考虑, 除非特殊情况, 否则保持这个选项关闭
yaf.forward_limit 5 PHP_INI_ALL forward最大嵌套深度,Yaf_Controller_Abstract::forward()
yaf.name_suffix 1 PHP_INI_ALL 1后缀,0前缀;类名中关键信息是否是后缀式, 比如UserModel, 而在前缀模式下则是ModelUser
yaf.name_separator PHP_INI_ALL 类名和前缀或后缀的分隔符;如设置为“_”, User_Model
yaf.cache_config 0 PHP_INI_SYSTEM 是否缓存INI文件配置,复杂配置下,可提高性能
yaf.environ product PHP_INI_SYSTEM 环境名称,Yaf会根据这个名称获取ini文件对应的配置
yaf.use_namespace 0 PHP_INI_SYSTEM 设置1时,所有Yaf类都将以命名空间样式命名


在开启yaf.cache_config的情况下, Yaf会使用INI文件路径作为Key, 这就有一个陷阱, 就是如果在一台服务器上同时运行俩个应用,
那么它们必须不能使用同一个路径名下的INI配置文件, 否则就会出现Application Path混乱的问题. 所以, 尽量不要使用相对路径。

运行时配置

php.ini

[yaf]
yaf.environ=develop
yaf.use_namespace=1

应用配置

Yaf的配置文件会和用户的配置文件合并。

区别在于,Yaf的配置文件是以”yaf.”或”application.”开头,如果两项都存在,则”application.”生效。

构造函数传递参数

new Yaf_Application( APPLICATION_PATH . "/conf/application.ini");
名字 默认 说明
application.directory 应用程序的目录,包含”controllers”, “views”, “models”, “plugins”等子目录。这是唯一一个没有默认值的配置项,你需要手动指定它。
application.ext “php” PHP脚本的扩展名,类的自动加载需要用到它( Yaf_Loader)。
application.view.ext “phtml” 视图模板扩展名。
application.modules “index” 注册的模块列表,以逗号分隔,用于路由处理,特别是当PATH_INFO超过三段的时候,Yaf需要用它来判断第一段是否是一个模块。
application.library application.directory . “/library” 本地类库的目录,参见Yaf_Loader 和 yaf.library。Yaf2.1.6以后,该配置项也可以是一个数组,当它是数组的时候,类库的路径将尝试使用application.library.directory的值。
application.library.directory application.directory . “/library” application.library 的别名,Yaf 2.1.6开始
application.library.namespace “” 逗号分隔的本地类库命名空间前缀。Yaf2.1.6以后加入
application.bootstrap application.directory . “/Bootstrap” . application.ext Bootstrap类脚本文件的绝对路径。
application.baseUri “” 路由处理中需要忽略的路径前缀。举个例子,请求”/prefix/controller/action”时。如果你将application.baseUri设置为”/prefix”,那么只有”/controller/action”会被当做路由路径。通常不需要设置此值。
application.dispatcher.defaultRoute 默认路由,如果未指定,静态路由会被当做是默认路由,参见: Yaf_Router::addRoute()。
application.dispatcher.throwException 1 开启此项,Yaf会在发生错误的地方抛出异常。参见 Yaf_Dispatcher::throwException()。
application.dispatcher.catchException 0 开启此项,如果有未捕获的异常,Yaf将会把它定向到Error controller, Error Action。参见 Yaf_Dispatcher::catchException()。
application.dispatcher.defaultModule “index” 默认模块名,参见 Yaf_Dispatcher::setDefaultModule()。
application.dispatcher.defaultController “index” 默认控制器名,参见 Yaf_Dispatcher::setDefaultController()。
application.dispatcher.defaultAction “index” 默认动作名,参见 Yaf_Dispatcher::setDefaultAction()。
application.system 在application.ini中设置Yaf运行时配置,如: application.system.lowcase_path,仅有PHP_INI_ALL配置项能这样设置

application.ini 示例

[common]
application.directory = APPLICATION_PATH  "/application"
application.library.namespace = ""
application.view.ext = "html"

;模块,必须有Index模块,且逗号分隔,不能有空格
application.modules = 'Index,User,Api'

[routes]
;添加一个名为simple的路由协议
routes.simple.type="simple"
routes.simple.controller=c
routes.simple.module=m
routes.simple.action=a

; 添加一个正则路由协议; http://localhost/myYaf/index.php/123, 12 就是userId
routes.user.type = "regex"
routes.user.match = "#^/([0-9]+)\/?#"
routes.user.route.module = "Index"
routes.user.route.controller = "Index"
routes.user.route.action = "test"
routes.user.map.1 = userId

[database]
database.driver     = mysql
database.host       = 127.0.0.1
database.database   = test
database.username   = root
database.password   = 123456789
database.port       = 3306
database.charset    = utf8
database.collation  = utf8_unicode_ci
database.prefix     = ""


[product : common : routes]

[develop : common : routes : database]
;当开启的时候,Yaf将会抛出异常而不是触发可捕捉的错误。
;1抛出异常. 0获取可以调试的错误
application.debug = TRUE

;开启/关闭自动异常捕获功能
;1 Yaf会将所有未捕获的异常交给Error Controller的Error Action来处理. 0直接打印
application.dispatcher.throwException = 0

;如果 throwException = 0,那么 catchException是什么都无所谓了. 因为catchException是捕获异常的.
;如果 throwException = 1, catchException的值决定异常处理方式.
;但catchException为1,必须定义Error Controller,否则还会报这个错误.
application.dispatcher.catchException = 0

配置继承:product 和 develop 都继承了common配置

代码中获取配置项的方法如下

$this->_config = Yaf_Application::app()->getConfig()->get("Redis");
$this->_host = $this->_config['servers']['host'];
$this->_port = $this->_config['servers']['port'];
$this->_db = $this->_config['servers']['db'];

当然,除了用yaf指定的application.ini配置之外,把所有的配置都归结到一个文件中,也可以分开配置,yaf中提供了\Yaf\Config\Ini类来处理这些额外的配置文件。

$config = new \Yaf\Config\Ini(APPLICATION_PATH . '/conf/url.ini', ini_get('yaf.environ'));

在实际读取的时候,最好能设置一个静态变量保存读取到的配置,避免重复申请系统open函数调用。如下:

static $config = null;
if ($config === null) {
    $config = new \Yaf\Config\Ini(APPLICATION_PATH . '/conf/url.ini', ini_get('yaf.environ'));
}

类库

Yaf启动的时候,出于性能的考虑, 对于框架相关的MVC类, Yaf会自动加载一次

类型 命名 路径
控制器 Controller 默认{项目路径}/controllers/, 或者 {项目路径}/modules/{模块名}/controllers/
模型 Model {项目路径}/models/
插件 Plugin {项目路径}/plugins/

非框架MVC相关的类, Yaf支持“全局类”和“本地应用类”的两种加载方式, 并且Yaf支持大小写敏感和不敏感两种方式来处理文件路径。


全局类: 所有项目之间共享的类, 这些类库的路径是通过yaf.libraryphp.ini配置
当自身框架中找不到类,就会到yaf.library设置的路径查找


本地类: 产品自身的类库, 这些类库的路径是通过在项目的配置文件中,通过application.library配置的.

手动导入

<?php
//绝对路径
Yaf\Loader::import("/usr/local/foo.php);

//相对路径, 会在APPLICATION_PATH."/library"下加载
Yaf\loader::import("plugins/User.php");