由于工作的关系,经常要跟SAF框架打交道,网上查了之后才发现只有简短的几篇介绍,说是加拿大的人开发的,经常开发CRM系统,早在01年就开始开源了,功能很强大。

之前写过一篇,怎么学习一个新的PHP框架,下面说说SAF框架的大致流程吧。

一,在/inc/config.xml里面添加一个Action

Path就是浏览器index/XXX后面浏览的uri

Type就是对应的一个控制器

Forward用于实例化smarty后显示的指定模板

二,在/Action里面添加一个对应的XXXAction.php

格式如下:

class XXXAction extends Action {

var $forword = "";

function AdminfoAction (&$db, &$cgi, &$session,&$smarty) {

$this->Action(&$db, &$cgi, &$session,&$smarty);

}        function run () {

$db = $this->db;

$cgi = $this->cgi;

$session = $this->session;

$smarty = $this->smarty;

}

... ...

... ...

... ...

$this->forword="success";

$this->smarty = $smarty;

}

三,在/template/templates/添加之前forward里面path对应的模板即可。

看到上面的小例子是不是很简单呢?下面璞玉说下具体的细节:

一、前言

SAF框架(Simplified Application Framework)是一种基于mvc的php开发框架,它的基本框架包括了权限控制,类的引

入,数据库初始化,模板初始化等,并通过一个xml配置文件,方便的引入各种template及DB处理类,并且还有丰富的函数

类库可供扩展。本文只是对saf使用的一点点心得,与大家共享。

二、saf框架结构

1.Controller(控制器)

index文件 (代码只做基本结构描述,非运行版本):

// 导入配置文件

include_once ('inc/config.php');

header ('X-Powered-By...'):

// 初始化各种类的路径

include("lib/saf/loader/Loader.php");

$loader = new Loader (array (

'smarty'   => 'lib/smarty/libs',

'pear'    => 'lib/pear',

'saf'      => 'lib/saf',

'search'    => 'lib/Search',

'other'     => 'lib/other',

'action'   => 'Action'

));

// 导入各种需要的类

//import各种类

$loader->import("pear.DB.*");

$loader->import("saf.cgi.*");

$loader->import("saf.xml.*");

$loader->import("smarty.Smarty_class");

$loader->import("Action.*");

// 数据库连接初始化

$dsn = "...";

$db = new DB;

$mydb = $db->connect($dsn,false);

if($db->isError($mydb)) {

die($mydb->getMessage());

exit;

}

// 解析uri路径

$cgi = new CGI;

$extras = $cgi->parseUri ();

if (empty ($cgi->page)) {

$cgi->page = $extras[PAGE_LEVEL];

}

if (empty ($cgi->page)) {

$cgi->page = 'index';

}

// 初始化session

$session = new $UseSessionClass ($SessionCookieName, $cgi->username, $cgi->password,$mydb);

// 判断是否有权限访问

if(!$session->can_read($cgi->page,$session->usergroup)){

if(!isset($cgi->from)){

$from=$_SERVER["REQUEST_URI"];

}else{

$from=$cgi->from;

}

$referer=$_SERVER["HTTP_REFERER"];

if($from=="login") $from = "/";

header ("Location: /index/login?cannot=1&from=".$from."&referer=".$referer);

}

// 解析xml配置文件

$actionsd = new SloppyDOM ;

if ($actionxml = $actionsd->parseFromFile (MY_ACTION_XML) ) {

$actionnodes = $actionxml->query ("struts-config/action-mappings/action");

} else {

echo $actionsd->error;

}

foreach($actionnodes as $onenode){

$onenodeobj = $onenode->makeRefObj();

$onenodeatt = $onenodeobj->attrs;

if($onenodeatt['path'] == $cgi->page){

$actionstr = $onenodeatt['type'];

$forword = $onenode->children;

}

}

// Smarty模板初始化

$smarty = new Smarty;

// Action初始化

if($actionstr != ""){

$action = new $actionstr($mydb,$cgi,$session,$smarty);

}

else{

echo "没有对应的Action处理程序";

exit();

}

$action->run();

// 显示内容

foreach($forword as $oneforword){

$oneforwordobj = $oneforword->makeRefObj();

$oneforwordatt = $oneforwordobj->attrs;

if($oneforwordatt['name'] == $action->forword){

$action->smarty->display("".$oneforwordatt['path']."");

}

}

控制器index文件是saf框架开发的核心,每一个action文件都要经过这个index来action到不同的action处理类,

再根据XML配置文件forward到不到的模板。

2.Model(模式):

每一个Action类都使用如下类似的结构:

class XXXAction extends Action {  var $forword = "";

function AdminfoAction (&$db, &$cgi, &$session,&$smarty) {

$this->Action(&$db, &$cgi, &$session,&$smarty);

}

function run () {

$db = $this->db;

$cgi = $this->cgi;

$session = $this->session;

$smarty = $this->smarty;

}

... ...

... ...

... ...

$this->forword="success";

$this->smarty = $smarty;

}

3.View(视图):

templates 模板文件

4.XML配置文件:

my-config.xml

5.附加说明

①我们看到的用于做controller的是index文件而不是index.php,这个可以通过apache的配置文件force做指定。

②saf框架内置了三种模板:SimpleTemplate、Template和Transformation,较早的saf直接使用xml/xsl来做页面

的呈现,这里我把它改写成了使用smarty模板引擎。

③关于权限控制,基于每一个action(以及对应的每一个xml配置里的forward模板)我另有一个单独的文件来做用

户组,可访问页面进行添加、删除和授权。

④本文使用是的一种经过我改造的saf框架模型,所以代码均为示例代码,仅供参考。

三、小结

saf是一种高效的开发框架,它不同于PEAR,ADODB这样的类库,而是一套真正用于产品的开发框架,可以方便的使用

各种函数类库,各种数据库封装的接口,以及不同的模板引擎。可以方便的用于基于php的较大规模的应用部署,如cms

系统,crm系统等。本文只是我根据以往的实践针对使用saf框架的一个简单介绍以及一些改造的经验,希望能起到抛砖引

玉的作用,把它能用于我们实际的产品、项目开发中,完善它,改造它。希望能帮助我们从繁杂的项目代码中得到一点解

脱。

本人水平有限,对saf的理解也不够充分,难免有很多错误和不足,希望大家指正。

另:读过本文的人可能会发现,这种框架很类似于jsp中的mvc开发模式,但作为基于php的版本,它可能更为简洁,使

用起来更为高效、快速,更能体现做为php来进行web开发的特点,同时又在一定程度上弥补了php在做大规模应用部署时的

先天不足。另有一种类似的php开发框架php.MVC,被称为php的struts版,可能更接近java的那种模式,这里就不赘述了。

欢迎与我交流

java saf,SAF框架介绍,SAF框架使用详解相关推荐

  1. Java学习日报—Swagger介绍 与 布隆过滤器详解—2021/12/01

    目录 1. Swagger 1.1 介绍 1.2 Swagger 的优势 1.3 简单使用 1.3.1 集成 Swagger 管理 API 文档 1.3.2 在线测试接口 1.4 常用注解 1.5 参 ...

  2. DL之YoloV3:Yolo V3算法的简介(论文介绍)、各种DL框架代码复现、架构详解、案例应用等配图集合之详细攻略

    DL之YoloV3:Yolo V3算法的简介(论文介绍).各种DL框架代码复现.架构详解.案例应用等配图集合之详细攻略 目录 Yolo V3算法的简介(论文介绍) 0.YoloV3实验结果 1.Yol ...

  3. Django框架学习(一)Django框架安装和项目创建详解

    Django框架学习(一)Django框架安装和项目创建详解 文章目录 Django框架学习(一)Django框架安装和项目创建详解 一.简介 1.1介绍 1.2 URL 1.3.框架原理 二.安装 ...

  4. python语言的格式框架_django框架模板语言使用方法详解

    本文实例讲述了django框架模板语言使用方法.分享给大家供大家参考,具体如下: 模板功能 作用:生成html界面内容,模版致力于界面如何显示,而不是程序逻辑.模板不仅仅是一个html文件,还包括了页 ...

  5. java加密算法入门(三)-非对称加密详解

    1.简单介绍 这几天一直在看非对称的加密,相比之前的两篇内容,这次看了两倍多的时间还云里雾里的,所以这篇文章相对之前的两篇,概念性的东西多了些,另外是代码的每一步我都做了介绍,方便自己以后翻阅,也方便 ...

  6. python的threading库_python标准库介绍——31 threading 模块详解

    threading 模块 (可选) ``threading`` 模块为线程提供了一个高级接口, 如 [Example 3-1 #eg-3-1] 所示. 它源自 Java 的线程实现. 和低级的 ``t ...

  7. Java开源生鲜电商平台-Java分布式以及负载均衡架构与设计详解(源码可下载)

    Java开源生鲜电商平台-Java分布式以及负载均衡架构与设计详解(源码可下载) 说明:主要是针对一些中大型的项目需要进行分布式以及负载均衡的架构提一些思路与建议. 面对大量用户访问.高并发请求,海量 ...

  8. java文件流 m.jb51.net_FasfDFS整合Java实现文件上传下载功能实例详解

    今天使用Java代码实现文件的上传和下载.对此作者提供了Java API支持,下载fastdfs-client-java将源码添加到项目中.或者在Maven项目pom.xml文件中添加依赖 org.c ...

  9. Java网络编程(6)NIO - Channel详解

    前言 NIO的三个核心组件:Buffer.Channel.Selector Java网络编程(4)NIO的理解与NIO的三个组件完成了大概的了解 Java网络编程(5)NIO - Buffer详解详细 ...

  10. java path类_基于java Files类和Paths类的用法(详解)

    Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream; import java.nio.file.FileSystem ...

最新文章

  1. 云场景实践研究第74期:科沃斯
  2. TJA1050只能RX不能TX
  3. .NetCore(四) 在Nginx部署
  4. QT中处理不同Windows(窗体中的)消息
  5. django from组件 实现增加 删除 编辑(推荐用法)
  6. C# Socket编程笔记(转)
  7. jpa和hibernate_使用JPA和Hibernate有效删除数据
  8. sublime学习笔记
  9. GET和POST请求到底有什么区别?
  10. 用户使用报告_【市场】最新手机用户使用报告 8+256GB成首选 小屏党哭了
  11. 20165329 学习基础和c语言调查
  12. maven聚合工程打包_史诗级!有手就会的Maven教程(八)
  13. 联通沃云服务器型号,云服务器
  14. PreferenceActivity的使用
  15. 考研词汇5500+地名
  16. matlab绘制分组条形图的误差棒errorbar
  17. uniapp全局数据(全局url、全局openId)
  18. 浪潮官网服务器型号,浪潮服务器有哪些型号,哪位了解?
  19. 【笔记分享】H桥电机正反转
  20. opengl SwapBuffers的等待,虚伪的FPS

热门文章

  1. 中国机器人产业图谱(2022)
  2. 深度:国产FPGA研究框架
  3. 7步!顶会Paper 复现方法!
  4. 去除stackoverflow页面上关不掉的cookie弹窗
  5. Android Studio Chipmunk 2021.2.1.15下载地址
  6. Eclipse Helios(3.6.2)下载地址
  7. C++20 coroutine 探索I:co_await 原理 | 使用 C++ 协程写 python generator
  8. 亚马逊16条领导力原则
  9. Open Infrastructure丹佛峰会:所有的华丽终将回归质朴
  10. vue集成汉字转拼音并提取首字母(附多音字解决方案)