一、架构总览
YAF是经典的MVC架构,主要组件如下:
(1)应用
YAF系统架构与生命周期的对象,由系统类Yaf_Application(启用命名空间的情况下是Yaf\Application)类完成,在入口文件中被初始化并被启动,在应用中可以使用Yaf_Application::app()(启用命名空间的情况下是Yaf\Application::app())来引用该对象
(2)模块
一个典型的应用是由多个模块组成的,这些模块通常都是应用目录下面的一个子目录,每个模块都自己独立的配置文件、公共文件和类库文件。模块可以功能分组。
(3)控制器
应用的调度层。每个模块拥有独立的MVC类库及配置文件,一个模块下面有多个控制器负责响应请求,而每个控制器其实就是一个独立的控制器类。
控制器主要负责请求的接收,并调用相关的模型处理,并最终通过视图输出或直接输出。严格来说,控制器不应该过多的介入业务逻辑处理。
(4)操作
一个控制器包含多个操作(方法),操作方法是一个URL访问的最小单元。在YAF中只有带Action后缀的方法才会对外部访问者开发。在YAF中还可以定义一个Action类处理某个操作。
(5)模型
应用的数据逻辑层。YAF框架中并没有自带数据库操作的类,我们可以自己封装相关DB操作,如使用PHP自带的PDO来对模型进行封装。
(6)视图
应用展示层。YAF框架自带了一个类似原生的视图,当然也可以集成第三方模板引擎如Smarty、Mustache等
(7)插件
通过内置的钩子工具可以实现在相应的执行阶段注册相关插件。
二、模块设计
1、模块目录结构
模块放置于应用的application\modules下面,其结构与application一样
如,新建一个config目录,表示后台配置模块,其结构如下:
2、模块配置
在application.ini中定义模块:
application.modules="Index,Config,System"
application.dispatcher.defaultModule=Index
注:上面定义了Index,Config,System三个模块,默认模块为Index
3、模块的使用
如新建一个模块Config:
(1)新建一个控制器文件Test.php
(文件路径:application/modules/Config/controllers/Test.php),内容如下:
classTestControllerextendsYaf\Controller_Abstract
{
publicfunctionhelloAction()
{
$this->getView()->assign('page','hello');
}
}
(2)新建一个视图文件hello.phtml
(文件路径:application/modules/Config/views/hello.phtml),内容如下:
(3)在浏览器中访问
http://{{ip:port}}/{{appname}}/config/test/hello
则显示:hello
三、命名空间
在php.ini文件中使用yaf.use_namespace = 1即可在项目中启用命名空间
1、框架系统类
系统类都是以Yaf为前缀的,启用命名空间后,大多数是以_换成\的形式引用类,如Yaf_Config_Ini类,使用命名空间后为Yaf\Config\Ini。
注:以_Abstract为后缀的类,一般和前面的一个单词是连在一起的,因为Abstract是一个关键词,不能当作类名,如Yaf_Controller_Abstract,使用命名空间的用法是Yaf\Controller_Abstract
2、自定义类自定义类一般放到application\library下,当然可以通过php.ini中的yaf.library来定义类库的位置或者通过application.ini中的application.library来定义类的位置
四、类加载器
Yaf中提供了Yaf\Loader加载器类实现类的加载(未启用命名空间时是Yaf_Loader)
1、自动加载(1)框架自动加载类
yaf在启动后会通过目录映射的形式自动加载MVC三层中的文件
Yaf目录映射规则
类型
后缀(或者前缀, 可以通过php.ini中ap.name_suffix来切换)
映射路径
控制器
Controller
默认模块下为{项目路径}/controllers/, 否则为{项目路径}/modules/{模块名}/controllers/
数据模型
Model
{项目路径}/models/
插件
Plugin
{项目路径}/plugins/
注:来源于yaf官方文档
(2)全局自动加载类
所有应用或项目共享的类,如所有项目都使用了smarty这个类库,可以全局加载,通过php.ini中的yaf.library来设置全局类的路径
(3)本地自动加载类
某个项目或应用中的需要自动加载的类,可以通过调用Yaf_Loader(命名空间下的Yaf\Loader)的registerLocalNamespace方法, 来申明那些类前缀是本地类,然后再通过调用Yaf_Loader的autoload方法自动加载
注:如果本地类在library目录下,是不需要注册的
例:在library目录下建立Baidu\Map\Ip.php的文件,内容如下:
namespaceBaidu\Map;
classIp
{
publicfunctiongetLocation($ip)
{
return'hz';
}
}
在控制器Test.php中调用:
classTestControllerextendsYaf\Controller_Abstract
{
publicfunctionhelloAction()
{
$ip=newBaidu\Map\Ip();
$location=$ip->getLocation('8.8.8.8');
$this->getView()->assign('page',$location);
}
}
将会输出:hz
2、文件导入(文件加载)
通过Yaf_Loader的import方法可以文件的导入或加载,推荐使用此方法代替require_once或者include_once
使用方法为:其参数为文件路径
//导入一个函数库文件common.php,即可使用common.php中的函数
Yaf\Loader::import(APP_PATH.'/application/helpers/common.php');