一年前由于工作原因,接触过一段时间鸟哥的yaf框架,关于yaf框架详细介绍请查看鸟哥的博客和yaf文档。后来就没在碰过了,昨天偶然看到一个关于yaf的视频,就顺手捡起来搭建一下环境。
下面就我的使用情况和遇到的问题做下记录。至于扩展安装什么的就不说了,只要安装能适合自己的php环境的就可以了。首先通过yaf源码的tools/cg/yaf_cg工具生成yaf推荐的标准目录结构。
- php yaf_cg [project_name] #这个我暂定为yaf
- 查看当前目录下output目录,生成了一个yaf目录,这就是一个完整的项目结构,可以复制部署到你熟悉的web服务下,详细的部署请查看yaf文档中相关章节
遇到的问题
一、smarty适配yaf
按照配置净smarty放置到application/library目录后,按照网上大多数推荐的方式放置Smarty_Adapter适配器后,细节可以参考这篇文章,由于smarty的目录结构和yaf的类库加载规则不同,总是会出现各种提示缺少类库,按照提示将所需类库import之后,输出简单的字符串变量可以运行,但是如果现在使用更多smarty功能,还是会提示缺少类库,于是再次导入。。。。。感觉一直这么干,不是办法呀,smarty可是有150多类库,也总不能挨个去尝试每个功能缺少那个类库吧,要疯掉的。。。。。
尝试了多个方法之后,终于放弃。。。。于是乎想起了迫不得已的方式,按照yaf的加载规则,改写smarty,组要是按照类名将文件放置于各文件夹里,并将文件改名,目录结构下改后如下:
稍微修改smarty部分源码,删除掉了Smarty.class.php中的一下内容:
/**
* Try loading the Smarty_Internal_Data class
* If we fail we must load Smarty's autoloader.
* Otherwise we may have a global autoloader like Composer
*/
if (!class_exists('Smarty_Autoloader', false)) {
if (!class_exists('Smarty_Internal_Data', true)) {
require_once dirname(__FILE__) . '/Autoloader.php';
Smarty_Autoloader::registerBC();
}
}
/**
* Load always needed external class files
*/
if (!class_exists('Smarty_Internal_Data', false)) {
require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_data.php';
}
require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_extension_handler.php';
require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_templatebase.php';
require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_template.php';
require_once SMARTY_SYSPLUGINS_DIR . 'smarty_resource.php';
require_once SMARTY_SYSPLUGINS_DIR . 'smarty_variable.php';
require_once SMARTY_SYSPLUGINS_DIR . 'smarty_template_source.php';
require_once SMARTY_SYSPLUGINS_DIR . 'smarty_template_resource_base.php';
类的加载将有yaf自动完成,修改的源码请查看这里。欢迎指正patch代码。
二、map路由配置
由于yaf采用传统的 模块/控制器/动作 模式,导致其路由只能有三层,但是个人比较喜欢多层那种。于是乎就找到map路由的配置,Bootstrap.php简单配置如下:
public function _initRoute(Yaf_Dispatcher $dispatcher) {
//在这里注册自己的路由协议,默认使用简单路由
$router = $dispatcher->getRouter();
$route = new Yaf_Route_Map(true, '?');
$router->addRoute('map', $route);
}
最终访问效果是:
三、参数获取问题
基于第二个问题的配置,发现通过 ?p=1 这种方式,无法获取到p的值,目前暂时还没找到解决方法,待找到了再补充。。。。也欢迎有办法的大神留言补充