用PHP5进行三层开发

php5

原文:http://www.onlamp.com/pub/a/php/2004/12/09/three_tier.html
Three-Tier Development with PHP 5
by Luis Yordano Cruz
12/09/2004

此文演示了PHP三层开发的强大功能,PEAR::DB_DataObject用于业务逻辑,Smarty用于显示逻辑,这里假设你熟

悉了HTML,Smarty,PEAR::DB_DataObject,Mysql和PHP5.如果你需要补充知识,下面的文章解释了一些原理:

用PHP DataObject简化业务逻辑
Smarty简介:一个PHP模板引擎
PHP可伸缩性:Myth

你应该已安装和配置好了Apache,MySQL,和PHP5(或者IIS,MySQL5和PHP)

PEAR::DB_DataObject
PEAR::DB_DataObject 是一个用户数据库访问的抽象API.它是一个基于PEAR::DB的SQL构建器和数据建模层.它

把数据库表映射到PHP类并且提供像SELECT,INSERT,UPDATE,和DELETE这样的公共SQL函数.这使即使不了

解SQL的开发者也可以写出好的数据库访问代码,并且鼓励演示逻辑和业务逻辑有一个清晰的分离.

(DB_OO已经移动到的PEAR,现在是DB_DataObject,如果你有老的代码要更新,查看关于从老的db_oo代码更新到

DB_DataObjects的注释).

相关阅读
 
Upgrading to PHP 5
By Adam Trachtenberg

Table of Contents
Index
Sample Chapter

Read Online--Safari Search this book on Safari:
    
 Only This Book All of Safari
Code Fragments only 
DataObject performs two tasks. First, it builds SQL statements based on the object's variables and the builder

methods. Second, it acts as a datastore for a table row. There's a core class, which you extend for each of

your tables so that you put the data logic inside the data classes. There's also an included Generator to make

your configuration files and your base classes.

DataObject 执行两个任务.第一,它构建基于对象变量的SQL语句和构建器方法.第二,它作为数据库表的数据存

储.这里有个核心类,对于每个表继承它,以使你把数据逻辑放入数据类中.这里还包括一个生成器,

DataObject 极大的简化了数据库访问代码,它使开发大型的,数据驱动的站点更加容易.

At present, Alan Knowles, the lead developer of PEAR::DB_DataObject, is working on a new project called DBDO,

a C implementation of the PEAR package DB_DataObjects, based on libgda. His goal is to create the next

generation of PEAR::DB_DataObjects.

SMARTY

Smarty是一个从web页演示中分离内容的PHP模板引擎.它使用GPL许可.

Large projects commonly separate the role of the graphic designer from that of the programmer. However,

programming in PHP has the tendency to combine those two roles in a person and inside the code. This can bring

difficulties when it comes time to change some part of the page's design. If the page mixes content and

presentation, the developer has to crawl through the program to find the presentation. Smarty helps to solve

this problem.

Combining the Two
The first thing to do when starting this project is to create a workspace in which to store the project's code.

Then it's time to configure PEAR::DB_DataObject to connect to the MySQL database MySQL (name: example),

map the database tables to PHP classes, and then configure Smarty for the presentation tier for the user. Here

are those steps in more detail:

创建工作环境

创建一个叫做dataobjects的目录.

从命令行安装PEAR::DB_DataObject,键入:
>pear install Date
>pear install DB_DataObject
>pear list

INSTALLED PACKAGES:
===================
PACKAGE         VERSION    STATE
Archive_Tar       1.2      stable
Console_Getopt    1.2      stable
DB                1.6.5    stable
DB_DataObject     1.7.1    stable  *(Goal)
Date              1.4.3    stable
Mail              1.1.3    stable
Net_SMTP          1.2.6    stable
Net_Socket        1.0.2    stable
PEAR              1.3.1    stable
PHPUnit           1.0.1    stable
XML_Parser        1.2.0    stable
XML_RPC           1.1.0    stable

安装和配置Smarty

从下载开始,(我使用2.6.5版的Smarty)解压到你自己的目录.从它的libs目录中把Smarty.class.php,

Smarty_Compiler.class.php, Config_File.class.php, and debug.tpl文件复制到dataobjects目录中.

还要复制core和plugins目录和其中所有的内容.创建几个新的目录,命名为templates, templates_c, configs,

和cache.

最后dataobjects目录包含:

|---- cache
|---- configs
|---- core
|---- plugins
|---- templates
|---- templates_c

11/10/2004  11:17 a.m.    <DIR> .
11/10/2004  11:17 a.m.    <DIR> ..
11/10/2004  11:17 a.m.    <DIR> cache
11/10/2004  11:17 a.m.    <DIR> configs
11/10/2004  11:17 a.m.    <DIR> core
11/10/2004  11:17 a.m.    <DIR> plugins
11/10/2004  11:17 a.m.    <DIR> templates
11/10/2004  11:17 a.m.    <DIR> templates_c
07/09/2004  09:48 a.m.  13,105 Config_File.class.php
16/04/2004  03:03 a.m.  5,117 debug.tpl
10/09/2004  02:15 p.m.  65,350 Smarty.class.php
10/09/2004  07:14 p.m.  90,924 Smarty_Compiler.class.php
              4 archivos        174,496 bytes
              8 dirs   6,699,454,464 bytes libres

创建数据库
创建一个名为example的数据库,它包含一个名为User的表,不必担心模式,稍后我们会创建.

配置PEAR::DB_DataObject
要构建数据对象,创建下面的文件

configDB.php
<?php
require_once 'DB/DataObject.php';
$config = parse_ini_file('example.ini',TRUE);

foreach($config as $class=>$values) {
    $options = &PEAR::getStaticProperty($class,'options');
    $options = $values;
}
?>

此脚本基于example配置文件中的值创建一个到数据库的连接,显示如下.

example.ini
[DB_DataObject]
database         = mysql://root:@localhost/example
schema_location  = /dataobjects/schema/
class_location   = /dataobjects/
require_prefix   = /dataobjects/
class_prefix     = DataObjects_
extends_location = DB/DataObject.php
extends          = DB_DataObject

自动构建数据库模式

包含两个过程,构建数据库的对象-关系映射,和从example数据库user表中自动创建一个类.在表中的所有字段

名将成为类成员变量.

创建适当的模式:

C:\PHP\PEAR\DB\DataObject>C:\PHP\php.exe createTables.php \
 C:\dataobjects\example.ini

这将生成User.php文件:

<?php
/**
 * Table Definition for user
 * www.knowsky.com
 */
require_once 'DB/DataObject.php';

class DataObjects_User extends DB_DataObject
{
    ###START_AUTOCODE

    /* the code below is auto generated do not remove the above tag */
    var $__table = 'user';       // table name
    var $user_Id;                // int(11)  not_null primary_key auto_increment
    var $first_Name;             // string(30)  not_null
    var $last_Name;              // string(40)  not_null
    var $email;                  // string(100)  not_null

    /* Static get */
    function staticGet($k,$v=NULL) {
  return DB_DataObject::staticGet('DataObjects_User',$k,$v);
 }

    /* the code above is auto generated do not remove the tag below */
    ###END_AUTOCODE
}
?>

它还会为user表模式生成example.ini配置文件:

[user]
user_Id    = 129
first_Name = 130
last_Name  = 130
email      = 130

[user__keys]
user_Id = N

Smarty files
It's time to create several files for Smarty:

Smarty文件
现在是创建几个Smarty文件的时候了:

include.php
1 <?
2   require('Smarty.class.php');
3   $smarty = new Smarty;
4   $smarty->template_dir = 'templates/';
5   $smarty->compile_dir  = 'templates_c/';
6   $smarty->config_dir   = 'configs/';
7   $smarty->cache_dir    =  'cache/';
?>

此脚本实例化了一个新Smarty对象.设置Smarty属性.

index.php
1 <?
2  require("include.php");
3  $smarty->assign('TITLE','ACCESS MySQL DATABASE IN THREE TIERS WITH PHP');
4  $smarty->assign('HEADER','WHAT WISH DO ?');
5  $smarty->display('index.tpl');
?>

给Smarty模板分配变量.

insert.php
1  <?
2  require("include.php");
3  $smarty->assign('TITLE','INSERT DATA');
4  $smarty->assign('HEADER','Insert Data');
5  $smarty->assign('data1','First Name');
6  $smarty->assign('data2','Last Name');
7  $smarty->assign('data3','email');
8  $smarty->display('insert.tpl');
?>

添加将在insert.tpl 使用的变量.调用模板insert.tpl .

save.php
1   <?
2   require_once('DB/DataObject.php');
3   require('configDB.php');
4   $user = DB_DataObject::factory('user');
5   $user->first_Name = $x;
6   $user->last_Name  = $y;
7   $user->email      = $z;
8   $user_Id = $user->insert();
9   $user->update();
10  echo "<script>location.href='index.php'</script>";
11 ?>

This script saves data by using a PEAR::DataObject for the user table. Line 2 loads the class DataObject, and

line 3 calls configdb.php to connect to the database. Line 4 creates an instance of a user object (see User.php).

Lines 5 through 7 pass the variables collected from the form in insert.tpl ($x, $y, and $z) in order to save the

data in the database. The primary key of the table is an autoincrement column, so it doesn't need a value there.

Line 8 inserts the object, and line 9 carries out an update.

view.php
1  <?
2   require_once('DB/DataObject.php');
3   require('configDB.php');
4   require("include.php");
5   $user = DB_DataObject::factory('user');
6   $user->find();
7   while ($user->fetch()) {
8      $smarty->append('users', array(
          'ID'        => $user->user_Id,
          'FIRSTNAME' => $user->first_Name,    
          'LASTNAME'  => $user->last_Name,    
          'EMAIL'     => $user->email,    
       ));
    }
9   $smarty->assign('TITLE','List Users');
10  $smarty->assign('HEADER','List User');
11  $smarty->assign('data0','User_Id');
12  $smarty->assign('data1','First Name');
13  $smarty->assign('data2','Last Name');
14  $smarty->assign('data3','email');
15  $smarty->display('view.tpl');
16  ?>

此脚本显示所有存储在user表中的数据.它加载PEAR::DataObject 和include.php文件(给smarty模板分配变量).
第5行创建一个user对象的工厂.第6行执行find()方法.SELECT * FROM user从数据库中检索出了数据,通

过fetch()方法为模板保存数据,一次返回一条记录.

9 到14行是分配其他的变量给Smarty.

这些文件都应当放在dataobjects目录中.

对于模板,这里有index.tpl,list.tpl,和save.tpl.这里是他们的代码:

index.tpl
1  <html>
2   <head>
3    <title>{$TITLE}</title>
4     <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
5   </head>
6   <table align="center">   
7    <tr>
8     <td>
9       <b>{$HEADER}</b>
10    </td>
11   </tr>
12  </table>   
13  <table width="250" border="1" align="center" >
14   <tr>
16     <td align="center">
17       <input type="button" name="insert" value="Insert"   
           >
18    </td>
19   </tr>
20   <tr>
21     <td align="center">
22      <input type="button" name="view" value="View"
          >
23   </td>
24   </tr>
25  </table>
26  </body>
27 </html>

站点主页,它在的3行和第9行分别显示$TITLE 和$HEADER,这些变量值是从index.php传递过来的.

这个脚本在web浏览器上生成两个按钮,Insert和View,他们有相应的行为.如果用户点击Insert,系统将调

用Insert.php.如果用户点击View,那么view.php将被调用

insert.tpl
1 <html>
2  <head>
3    <title>{$TITLE}</title>
4     <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
5  </head>
6  <body>
7     <form name="form1" action="save.php" method="post">
8       <table width="300" border="1" align="center" >
9        <tr>
10          <td align="center">
11            <b>{$HEADER}</b>
12         </td>
13       </tr>
14       <tr>
15         <td>
16           {$data1}
17            <input type="text" name="x">
18         </td>
19       </tr>
20       <tr>
21         <td>
22           {$data2}
23            <input type="text" name="y">
24         </td>
25       </tr>
26       <tr>
27         <td>
28           {$data3}
29            <input type="text" name="z">
30         </td>
31       </tr>
32       <tr>
33          <td align="center">
34            <input type="submit" name="Submit" value="Add">
35            <input type="button" name="Reset" value="Return/Cancel"
                 >
36          </td>
37        </tr>
38      </table>
39    </form>
40  </body>
41 </html>

这个模板有一个表单和两个按钮,Add 和Return/Cancel.

用户输入数据,first name,last name 和电子邮件字段.insert.php期望在名为x,y,z的变量中接收这些信息,用户点

击Add按钮将运行save.php.如果用户点击Return/Cancel,将会执行index.php.

view.tpl
1 <html>
2  <head>
3    <title>{$TITLE}</title>
4  </head>
5  <body>
6   <table align="center">
7      <tr>
8         <td align="center">
9         <b>{$HEADER}</b>
10       </td>
11     </tr>
12     </table>
13   <table width="500" border="1" align="center">
14   <tr>
16        <td align="center">
17         <b>{$data0}</b>
18       </td>
19        <td align="center">
20         <b>{$data1}</b>
21       </td>
22        <td align="center">
23         <b>{$data2}</b>
24       </td>
25     <td align="center">
26         <b>{$data3}</b>
27       </td>
28     </tr>
29  {section name=display loop=$users}
30     <tr>
31       <td>
32         {$users[display].ID}
33       </td>
34       <td>
35         {$users[display].FIRSTNAME}
36       </td>
37       <td>
38         {$users[display].LASTNAME}
39       </td>
40       <td>
41         {$users[display].EMAIL}
42       </td>
43     </tr>
44     {/section}
45     <br>
46   </table>
47   <br>
48    <table align="center">
49     <tr>
50        <td align="center">
51          <input name="vol" type="button" value="Return" 
               >
52       </td>
53     </tr>
54   </table>
55  </body>
56 </html>

这个模板显示所有存储在example数据库中的所有数据.

最后,Return按钮把用户带回到主页.

所有的这些(*.tpl)文件必须放在templates目录下.

时间: 2025-01-01 15:06:06

用PHP5进行三层开发的相关文章

PHP5自定义Module开发

本文中需要用到上一篇文章中,只不过需要编译成动态或静态链接库的形式.本文中,将WebService客户端程序中的main()改名为testPhpModule(),并将打印到控制台的字符串返回,编译完成后生成文件名为libTest.so. 一.环境准备 将生成的libTest.so文件拷贝到/usr/lib目录下,并执行命令/sbin/ldconfig 准备PHP的源代码文件,解压缩. 二.开发PHP Module 首先进入PHP源代码目录中的ext目录,执行如下命令: # ./ext_skel

Php5.0说明 ------为面向对象而生的php5

php5|对象 Php5.0说明 ------为面向对象而生的php5 为面向对象而生的PHP5--------------------------------------------- [摘要]目前开发中的PHP5,其面向对象的机能已经被大幅度的强化了.下一代的PHP将会是怎样的一种语言呢?下面我们来详细讲解一下目前发布的PHP5的beta release. (一) Zend 2.0的诞生现在的PHP4所使用的基本文法是被称之为Zend 引擎的脚本编译引擎.这个就是PHP4的优良机能的原因之一

开发基于ASP.NET的自定义日志系统

asp.net 摘 要 介绍了利用ASP.NET和VB.NET技术开发的用户日志管理系统,实现了对自定义格式数据库系统的动态管理,使得对日志信息的管理更加及时.高效,提高了工作效率. 关键词 ASP.NET:VB.NET:自定义:日志:数据库 自定义日志管理的数据库设计 自定义日志系统是校园网一卡通系统中机房刷卡子系统的一个基于B/S开发的功能模块,该系统的后台数据库为自定义格式的数据库系统.数据库中主要的用户表和日志表的结构如下: Structure FixUse '用户表Public ID

关于物理三层架构的问题

问题描述 各位好,现在遇到个问题.客户的网络环境要求按Web,app,DB物理三层开发网站.最初的方式是将mvc的网站部署到appserver上,然后通过在Web服务器上部署nginx反向代理到app服务器.通过app服务器连接数据库.这是完全没有问题的.但现在客户要求通过他们公司的统一身份认证SiteMinder系统实现用户验证,这个统一身份认证相当于是个WebAgent,当用户访问我的网站URL时,被他截取到跳转到统一的login页面,用户登录后,在redirect到我的网站,返回一个coo

ASP.NET 三层架构使用IDAL 接口层有什么作用,有和妙用,使用业务逻辑层BLL直接调用数据层DAL不可以嘛。

问题描述 我们通常是UIweb层调用BLL层,BLL层调用DAL达到数据的交换.但是看到大多数项目是有个IDAL接口,只是声明方法没有任何的代码实现部分,代码实现部分都放在了DAL层,然后BLL层去调用IDAL接口层的方法实现,并没有去调用DAL层,UI层调用BLL层,这里的接口层有和作用,请教各位帮忙解答,不胜感激! 解决方案 解决方案二:IDAL是DAL层的类要实现的接口.DAL层的各类需要完成对数据库的访问,但是不同的数据库需要使用不同的DAL对象,这样对于BLL层来说无法实现数据库无关性

Ubuntu怎么安装Apache2+MySQL+PHP5服务器环境

首先进入Synaptic Package Manager,如果没有的话请到Ubuntu Software Center中下载一下: 然后依次搜索apache2.php5.mysql 勾选apache2,其他的依赖项和子项会自动被勾选 搜索并勾选php5 搜索并勾选mysql-server-5.5(或勾选mysql-server,它会自动为你选则一个最新版本的) 搜索phpmyadmin,并勾选 点击Apply,进行下载和安装 安装过程中按照指示,会提示让你输入mysql数据库管理员密码,设置ph

有人在吗,问一下asp.net三层架构中不清楚的问题

问题描述 1,画面上的一些控件,对应不同表的数据,是应该用不同表对应的实体来填充,还是针对画面上的控件,在单独整一个实体出来2,商业逻辑层,如果是针对多表的复杂操作,应该放在哪里3,bll层查询返回多行时,用datatable就可以,有必要用对象的集合吗,感觉多此一举 解决方案 解决方案二:以下只是本人的想法:1,对于像列表这种实体绑定,如果字段太多可以根据显示的要求,整一个只读的实体出来.2,可以用存储过程中进行.3,面向对象用实体类集合有更好的封装.还有就是datatable不是强类型的.解

asp.net开发调查,专家们请踊跃交流分享下你们的经验。谢谢。。。

问题描述 做一个asp.net站点.现在开发方式是什么?1.有几个是直接拖拉数据组件sqldatasource,然后直接操作数据库,有几个是直接FormViewGridView向导直接快速开发模式来做一个项目的:有几个是都把类库放在App_Code文件夹下的开发方式,有几个是用三层结构来开发的.注:后面两者,你们开发的时候,哪个情况比较多?2.asp.net站点前台你们开发时是A.美工设计好图片,程序员自己切割图片做成html,再做成aspx;B.美工设计好图片,并作成html,程序员根据htm

求帮助啊.NET三层架构的登录

问题描述 哪位大虾能帮忙建立一个基于.NET做一个三层架构的网页型,学生信息管理系统1012983069@qq.com 解决方案 解决方案二: 解决方案三:唉,为了你好,找百度,或者51aspx.....去下一个看看吧解决方案四:引用2楼kevin87923的回复: 唉,为了你好,找百度,或者51aspx.....去下一个看看吧 嗯同意解决方案五:登陆的相关内容不会做解决方案六:51aspx.com解决方案七:都找过了呢都不是三层的..苍天啊解决方案八:引用4楼zcw3333的回复: 登陆的相关