开发学院WEB开发PHP 数据源架构模式的活动记录 阅读

数据源架构模式的活动记录

 2010-10-18 13:30:49 来源:WEB开发网   
核心提示:【活动记录的意图】一个对象,它包装数据表或视图中某一行,数据源架构模式的活动记录,封装数据库访问,并在这些数据上增加了领域逻辑,使表深化成为活动记录,对于活动记录中的域的访问和设置可以如yii框架一样,【活动记录的适用场景】适用于不太复杂的领域逻辑,如CRUD操作等

【活动记录的意图】

一个对象,它包装数据表或视图中某一行,封装数据库访问,并在这些数据上增加了领域逻辑。

【活动记录的适用场景】

适用于不太复杂的领域逻辑,如CRUD操作等。

【活动记录的运行机制】

对象既有数据又有行为。其使用最直接的方法,将数据访问逻辑置于领域对象中。

活动记录的本质是一个领域模型,这个领域模型中的类和基数据库中的记录结构应该完全匹配,类的每个域对应表的每一列。

一般来说,活动记录包括如下一些方法:

1、由数据行构造一个活动记录实例;

2、为将来对表的插入构造一个新的实例;

3、用静态查找方法来包装常用的SQL查询和返回活动记录;

4、更新数据库并将活动记录中的数据插入数据库;

5、获取或设置域;

6、实现部分业务逻辑。

【活动记录的优点和缺点】

优点:

1、简单,容易创建并且容易理解。

2、在使用事务脚本时,减少代码复制。

3、可以在改变数据库结构时不改变领域逻辑。

4、基于单个活动记录的派生和测试验证会很有效。

缺点:

1、没有隐藏关系数据库的存在。

2、仅当活动记录对象和数据库中表直接对应时,活动记录才会有效。

3、要求对象的设计和数据库的设计紧耦合,这使得项目中的进一步重构很困难

【活动记录与其它模式】

数据源架构模式之行数据入口:活动记录与行数据入口十分类似。二者的主要差别是行数据入口 仅有数据库访问而活动记录既有数据源逻辑又有领域逻辑。

【活动记录的PHP示例】

  1. <?php  
  2.    
  3. /**  
  4.  * 企业应用架构 数据源架构模式之活动记录 2010-10-17 sz  
  5.  * @author phppan.p#gmail.com http://www.phppan.com  
  6.  * 哥学社成员(http://www.blog-brother.com/)  
  7.  * @package architecture  
  8.  */ 
  9.    
  10. /**  
  11.  * 定单类  
  12.  */ 
  13. class Order {  
  14.    
  15.   /**  
  16.    * 定单ID  
  17.    * @var <type>  
  18.    */ 
  19.   private $_order_id;  
  20.    
  21.   /**  
  22.    * 客户ID  
  23.    * @var <type>  
  24.    */ 
  25.   private $_customer_id;  
  26.    
  27.   /**  
  28.    * 定单金额  
  29.    * @var <type>  
  30.    */ 
  31.   private $_amount;  
  32.    
  33.   public function __construct($order_id$customer_id$amount) {  
  34.     $this->_order_id = $order_id;  
  35.     $this->_customer_id = $customer_id;  
  36.     $this->_amount = $amount;  
  37.   }  
  38.    
  39.   /**  
  40.    * 实例的删除操作  
  41.    */ 
  42.   public function delete() {  
  43.     $sql = "DELETE FROM Order SET WHERE order_id = " . $this->_order_id . " AND customer_id = " . $this->_customer_id;  
  44.     return DB::query($sql);  
  45.   }  
  46.    
  47.   /**  
  48.    * 实例的更新操作  
  49.    */ 
  50.   public function update() {  
  51.   }  
  52.    
  53.   /**  
  54.    * 插入操作  
  55.    */ 
  56.   public function insert() {  
  57.   }  
  58.    
  59.   public static function load($rs) {  
  60.     return new Order($rs['order_id'] ? $rs['order_id'] : NULL, $rs['customer_id'], $rs['amount'] ? $rs['amount'] : 0);  
  61.   }  
  62.    
  63. }  
  64.    
  65. class Customer {  
  66.    
  67.   private $_name;  
  68.   private $_customer_id;  
  69.    
  70.   public function __construct($customer_id$name) {  
  71.     $this->_customer_id = $customer_id;  
  72.     $this->_name = $name;  
  73.   }  
  74.    
  75.   /**  
  76.    * 用户删除定单操作 此实例方法包含了业务逻辑  
  77.    * 通过调用定单实例实现  
  78.    * 假设此处是对应的删除操作(实际中可能是一种以某字段来标记的假删除操作)  
  79.    */ 
  80.   public function deleteOrder($order_id) {  
  81.     $order = Order::load(array('order_id' => $order_id'customer_id' => $this->_customer_id));  
  82.     return $order->delete();  
  83.   }  
  84.    
  85.   /**  
  86.    * 实例的更新操作  
  87.    */ 
  88.   public function update() {  
  89.   }  
  90.    
  91.   /**  
  92.    * 入口类自身拥有插入操作  
  93.    */ 
  94.   public function insert() {  
  95.   }  
  96.    
  97.   public static function load($rs) {  
  98.     /* 此处可加上缓存 */ 
  99.     return new Customer($rs['customer_id'] ? $rs['customer_id'] : NULL, $rs['name']);  
  100.   }  
  101.    
  102.   /**  
  103.    * 根据客户ID 查找  
  104.    * @param integer $id  客户ID  
  105.    * @return Customer 客户对象  
  106.    */ 
  107.   public static function find($id) {  
  108.     return CustomerFinder::find($id);  
  109.   }  
  110.    
  111. }  
  112.    
  113. /**  
  114.  * 人员查找类  
  115.  */ 
  116. class CustomerFinder {  
  117.    
  118.   public static function find($id) {  
  119.     $sql = "SELECT * FROM person WHERE customer_id = " . $id;  
  120.     $rs = DB::query($sql);  
  121.    
  122.     return Customer::load($rs);  
  123.   }  
  124. }  
  125.    
  126. class DB {  
  127.    
  128.   /**  
  129.    * 这只是一个执行SQL的演示方法  
  130.    * @param string $sql  需要执行的SQL  
  131.    */ 
  132.   public static function query($sql) {  
  133.     echo "执行SQL: "$sql" <br />";  
  134.    
  135.      if (strpos($sql'SELECT') !== FALSE) { // 示例,对于select查询返回查询结果  
  136.       return array('customer_id' => 1, 'name' => 'Martin');  
  137.     }  
  138.   }  
  139.    
  140. }  
  141.    
  142. /**  
  143.  * 客户端调用  
  144.  */ 
  145. class Client {  
  146.    
  147.   /**  
  148.    * Main program.  
  149.    */ 
  150.   public static function main() {  
  151.    
  152.    
  153.     header("Content-type:text/html; charset=utf-8");  
  154.    
  155.     /* 加载客户ID为1的客户信息 */ 
  156.     $customer = Customer::find(1);  
  157.    
  158.     /* 假设用户拥有的定单id为 9527*/ 
  159.     $customer->deleteOrder(9527);  
  160.   }  
  161.    
  162. }  
  163.    
  164. Client::main();  
  165. ?> 

同前面的文章一样,这仅仅是一个活动记录的示例,关于活动记录模式的应用,可以查看Yii框架中的DB类,在其源码中有一个CActiveRecord抽象类,从这里可以看到活动记录模式的应用

另外,如果从事务脚本中创建活动记录,一般是首先将表包装为入口,接着开始行为迁移,使表深化成为活动记录。

对于活动记录中的域的访问和设置可以如yii框架一样,使用魔术方法__set方法和__get方法。

Tags:数据源 架构

编辑录入:爽爽 [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
更多精彩
    赞助商链接

    热点阅读
      焦点图片
        最新推荐
          精彩阅读