SAF框架介绍

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

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

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

<action path="XXX" type="XXXAction">            
 <forward name="success" path="XXX.tpl" />      
</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的那种模式,这里就不赘述了。

欢迎与我交流 pooy#pooy.net
2012-05-20

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="">

请选择吧!