首页 > 后端开发 > php教程 > 数据源架构模式的活动记录

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
发布: 2016-06-01 14:24:23
原创
898 人浏览过

【活动记录的意图】

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

【活动记录的适用场景】

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

【活动记录的运行机制】

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

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

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

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

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

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

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

5、获取或设置域;

6、实现部分业务逻辑。

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

优点:

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

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

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

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

缺点:

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

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

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

【活动记录与其它模式】

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

【活动记录的PHP示例】

<ol class="dp-c">
<li class="alt"><span><span><?php  </span></span></span></li>
<li><span>   </span></li>
<li class="alt">
<span class="comment">/** </span> </li>
<li><span><span class="comment"> * 企业应用架构 数据源架构模式之活动记录 2010-10-17 sz </span> </span></li>
<li class="alt"><span><span class="comment"> * @author phppan.p#gmail.com http://www.phppan.com </span> </span></li>
<li><span><span class="comment"> * 哥学社成员(http://www.blog-brother.com/) </span> </span></li>
<li class="alt"><span><span class="comment"> * @package architecture </span> </span></li>
<li><span><span class="comment"> */</span><span> </span></span></li>
<li class="alt"><span>   </span></li>
<li>
<span class="comment">/** </span> </li>
<li class="alt"><span><span class="comment"> * 定单类 </span> </span></li>
<li><span><span class="comment"> */</span><span> </span></span></li>
<li class="alt">
<span class="keyword">class</span><span> Order {  </span>
</li>
<li><span>   </span></li>
<li class="alt">
<span>  </span><span class="comment">/** </span> </li>
<li><span><span class="comment">   * 定单ID </span> </span></li>
<li class="alt"><span><span class="comment">   * @var <type> </type></span> </span></li>
<li><span><span class="comment">   */</span><span> </span></span></li>
<li class="alt">
<span>  </span><span class="keyword">private</span><span> </span><span class="vars">$_order_id</span><span>;  </span>
</li>
<li><span>   </span></li>
<li class="alt">
<span>  </span><span class="comment">/** </span> </li>
<li><span><span class="comment">   * 客户ID </span> </span></li>
<li class="alt"><span><span class="comment">   * @var <type> </type></span> </span></li>
<li><span><span class="comment">   */</span><span> </span></span></li>
<li class="alt">
<span>  </span><span class="keyword">private</span><span> </span><span class="vars">$_customer_id</span><span>;  </span>
</li>
<li><span>   </span></li>
<li class="alt">
<span>  </span><span class="comment">/** </span> </li>
<li><span><span class="comment">   * 定单金额 </span> </span></li>
<li class="alt"><span><span class="comment">   * @var <type> </type></span> </span></li>
<li><span><span class="comment">   */</span><span> </span></span></li>
<li class="alt">
<span>  </span><span class="keyword">private</span><span> </span><span class="vars">$_amount</span><span>;  </span>
</li>
<li><span>   </span></li>
<li class="alt">
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">function</span><span> __construct(</span><span class="vars">$order_id</span><span>, </span><span class="vars">$customer_id</span><span>, </span><span class="vars">$amount</span><span>) {  </span>
</li>
<li>
<span>    </span><span class="vars">$this</span><span>->_order_id = </span><span class="vars">$order_id</span><span>;  </span>
</li>
<li class="alt">
<span>    </span><span class="vars">$this</span><span>->_customer_id = </span><span class="vars">$customer_id</span><span>;  </span>
</li>
<li>
<span>    </span><span class="vars">$this</span><span>->_amount = </span><span class="vars">$amount</span><span>;  </span>
</li>
<li class="alt"><span>  }  </span></li>
<li><span>   </span></li>
<li class="alt">
<span>  </span><span class="comment">/** </span> </li>
<li><span><span class="comment">   * 实例的删除操作 </span> </span></li>
<li class="alt"><span><span class="comment">   */</span><span> </span></span></li>
<li>
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">function</span><span> </span><span class="func">delete</span><span>() {  </span>
</li>
<li class="alt">
<span>    </span><span class="vars">$sql</span><span> = </span><span class="string">"DELETE FROM Order SET WHERE order_id = "</span><span> . </span><span class="vars">$this</span><span>->_order_id . </span><span class="string">" AND customer_id = "</span><span> . </span><span class="vars">$this</span><span>->_customer_id;  </span>
</li>
<li>
<span>    </span><span class="keyword">return</span><span> DB::query(</span><span class="vars">$sql</span><span>);  </span>
</li>
<li class="alt"><span>  }  </span></li>
<li><span>   </span></li>
<li class="alt">
<span>  </span><span class="comment">/** </span> </li>
<li><span><span class="comment">   * 实例的更新操作 </span> </span></li>
<li class="alt"><span><span class="comment">   */</span><span> </span></span></li>
<li>
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">function</span><span> update() {  </span>
</li>
<li class="alt"><span>  }  </span></li>
<li><span>   </span></li>
<li class="alt">
<span>  </span><span class="comment">/** </span> </li>
<li><span><span class="comment">   * 插入操作 </span> </span></li>
<li class="alt"><span><span class="comment">   */</span><span> </span></span></li>
<li>
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">function</span><span> insert() {  </span>
</li>
<li class="alt"><span>  }  </span></li>
<li><span>   </span></li>
<li class="alt">
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">function</span><span> load(</span><span class="vars">$rs</span><span>) {  </span>
</li>
<li>
<span>    </span><span class="keyword">return</span><span> </span><span class="keyword">new</span><span> Order(</span><span class="vars">$rs</span><span>[</span><span class="string">'order_id'</span><span>] ? </span><span class="vars">$rs</span><span>[</span><span class="string">'order_id'</span><span>] : NULL, </span><span class="vars">$rs</span><span>[</span><span class="string">'customer_id'</span><span>], </span><span class="vars">$rs</span><span>[</span><span class="string">'amount'</span><span>] ? </span><span class="vars">$rs</span><span>[</span><span class="string">'amount'</span><span>] : 0);  </span>
</li>
<li class="alt"><span>  }  </span></li>
<li><span>   </span></li>
<li class="alt"><span>}  </span></li>
<li><span>   </span></li>
<li class="alt">
<span class="keyword">class</span><span> Customer {  </span>
</li>
<li><span>   </span></li>
<li class="alt">
<span>  </span><span class="keyword">private</span><span> </span><span class="vars">$_name</span><span>;  </span>
</li>
<li>
<span>  </span><span class="keyword">private</span><span> </span><span class="vars">$_customer_id</span><span>;  </span>
</li>
<li class="alt"><span>   </span></li>
<li>
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">function</span><span> __construct(</span><span class="vars">$customer_id</span><span>, </span><span class="vars">$name</span><span>) {  </span>
</li>
<li class="alt">
<span>    </span><span class="vars">$this</span><span>->_customer_id = </span><span class="vars">$customer_id</span><span>;  </span>
</li>
<li>
<span>    </span><span class="vars">$this</span><span>->_name = </span><span class="vars">$name</span><span>;  </span>
</li>
<li class="alt"><span>  }  </span></li>
<li><span>   </span></li>
<li class="alt">
<span>  </span><span class="comment">/** </span> </li>
<li><span><span class="comment">   * 用户删除定单操作 此实例方法包含了业务逻辑 </span> </span></li>
<li class="alt"><span><span class="comment">   * 通过调用定单实例实现 </span> </span></li>
<li><span><span class="comment">   * 假设此处是对应的删除操作(实际中可能是一种以某字段来标记的假删除操作) </span> </span></li>
<li class="alt"><span><span class="comment">   */</span><span> </span></span></li>
<li>
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">function</span><span> deleteOrder(</span><span class="vars">$order_id</span><span>) {  </span>
</li>
<li class="alt">
<span>    </span><span class="vars">$order</span><span> = Order::load(</span><span class="keyword">array</span><span>(</span><span class="string">'order_id'</span><span> => </span><span class="vars">$order_id</span><span>, </span><span class="string">'customer_id'</span><span> => </span><span class="vars">$this</span><span>->_customer_id));  </span>
</li>
<li>
<span>    </span><span class="keyword">return</span><span> </span><span class="vars">$order</span><span>-></span><span class="func">delete</span><span>();  </span>
</li>
<li class="alt"><span>  }  </span></li>
<li><span>   </span></li>
<li class="alt">
<span>  </span><span class="comment">/** </span> </li>
<li><span><span class="comment">   * 实例的更新操作 </span> </span></li>
<li class="alt"><span><span class="comment">   */</span><span> </span></span></li>
<li>
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">function</span><span> update() {  </span>
</li>
<li class="alt"><span>  }  </span></li>
<li><span>   </span></li>
<li class="alt">
<span>  </span><span class="comment">/** </span> </li>
<li><span><span class="comment">   * 入口类自身拥有插入操作 </span> </span></li>
<li class="alt"><span><span class="comment">   */</span><span> </span></span></li>
<li>
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">function</span><span> insert() {  </span>
</li>
<li class="alt"><span>  }  </span></li>
<li><span>   </span></li>
<li class="alt">
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">function</span><span> load(</span><span class="vars">$rs</span><span>) {  </span>
</li>
<li>
<span>    </span><span class="comment">/* 此处可加上缓存 */</span><span> </span>
</li>
<li class="alt">
<span>    </span><span class="keyword">return</span><span> </span><span class="keyword">new</span><span> Customer(</span><span class="vars">$rs</span><span>[</span><span class="string">'customer_id'</span><span>] ? </span><span class="vars">$rs</span><span>[</span><span class="string">'customer_id'</span><span>] : NULL, </span><span class="vars">$rs</span><span>[</span><span class="string">'name'</span><span>]);  </span>
</li>
<li><span>  }  </span></li>
<li class="alt"><span>   </span></li>
<li>
<span>  </span><span class="comment">/** </span> </li>
<li class="alt"><span><span class="comment">   * 根据客户ID 查找 </span> </span></li>
<li><span><span class="comment">   * @param integer $id  客户ID </span> </span></li>
<li class="alt"><span><span class="comment">   * @return Customer 客户对象 </span> </span></li>
<li><span><span class="comment">   */</span><span> </span></span></li>
<li class="alt">
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">function</span><span> find(</span><span class="vars">$id</span><span>) {  </span>
</li>
<li>
<span>    </span><span class="keyword">return</span><span> CustomerFinder::find(</span><span class="vars">$id</span><span>);  </span>
</li>
<li class="alt"><span>  }  </span></li>
<li><span>   </span></li>
<li class="alt"><span>}  </span></li>
<li><span>   </span></li>
<li class="alt">
<span class="comment">/** </span> </li>
<li><span><span class="comment"> * 人员查找类 </span> </span></li>
<li class="alt"><span><span class="comment"> */</span><span> </span></span></li>
<li>
<span class="keyword">class</span><span> CustomerFinder {  </span>
</li>
<li class="alt"><span>   </span></li>
<li>
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">function</span><span> find(</span><span class="vars">$id</span><span>) {  </span>
</li>
<li class="alt">
<span>    </span><span class="vars">$sql</span><span> = </span><span class="string">"SELECT * FROM person WHERE customer_id = "</span><span> . </span><span class="vars">$id</span><span>;  </span>
</li>
<li>
<span>    </span><span class="vars">$rs</span><span> = DB::query(</span><span class="vars">$sql</span><span>);  </span>
</li>
<li class="alt"><span>   </span></li>
<li>
<span>    </span><span class="keyword">return</span><span> Customer::load(</span><span class="vars">$rs</span><span>);  </span>
</li>
<li class="alt"><span>  }  </span></li>
<li><span>}  </span></li>
<li class="alt"><span>   </span></li>
<li>
<span class="keyword">class</span><span> DB {  </span>
</li>
<li class="alt"><span>   </span></li>
<li>
<span>  </span><span class="comment">/** </span> </li>
<li class="alt"><span><span class="comment">   * 这只是一个执行SQL的演示方法 </span> </span></li>
<li><span><span class="comment">   * @param string $sql  需要执行的SQL </span> </span></li>
<li class="alt"><span><span class="comment">   */</span><span> </span></span></li>
<li>
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">function</span><span> query(</span><span class="vars">$sql</span><span>) {  </span>
</li>
<li class="alt">
<span>    </span><span class="func">echo</span><span> </span><span class="string">"执行SQL: "</span><span>, </span><span class="vars">$sql</span><span>, </span><span class="string">" <br>"</span><span>;  </span>
</li>
<li><span>   </span></li>
<li class="alt">
<span>     </span><span class="keyword">if</span><span> (</span><span class="func">strpos</span><span>(</span><span class="vars">$sql</span><span>, </span><span class="string">'SELECT'</span><span>) !== FALSE) { </span><span class="comment">// 示例,对于select查询返回查询结果 </span><span> </span>
</li>
<li>
<span>      </span><span class="keyword">return</span><span> </span><span class="keyword">array</span><span>(</span><span class="string">'customer_id'</span><span> => 1, </span><span class="string">'name'</span><span> => </span><span class="string">'Martin'</span><span>);  </span>
</li>
<li class="alt"><span>    }  </span></li>
<li><span>  }  </span></li>
<li class="alt"><span>   </span></li>
<li><span>}  </span></li>
<li class="alt"><span>   </span></li>
<li>
<span class="comment">/** </span> </li>
<li class="alt"><span><span class="comment"> * 客户端调用 </span> </span></li>
<li><span><span class="comment"> */</span><span> </span></span></li>
<li class="alt">
<span class="keyword">class</span><span> Client {  </span>
</li>
<li><span>   </span></li>
<li class="alt">
<span>  </span><span class="comment">/** </span> </li>
<li><span><span class="comment">   * Main program. </span> </span></li>
<li class="alt"><span><span class="comment">   */</span><span> </span></span></li>
<li>
<span>  </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">function</span><span> main() {  </span>
</li>
<li class="alt"><span>   </span></li>
<li><span>   </span></li>
<li class="alt">
<span>    header(</span><span class="string">"Content-type:text/html; charset=utf-8"</span><span>);  </span>
</li>
<li><span>   </span></li>
<li class="alt">
<span>    </span><span class="comment">/* 加载客户ID为1的客户信息 */</span><span> </span>
</li>
<li>
<span>    </span><span class="vars">$customer</span><span> = Customer::find(1);  </span>
</li>
<li class="alt"><span>   </span></li>
<li>
<span>    </span><span class="comment">/* 假设用户拥有的定单id为 9527*/</span><span> </span>
</li>
<li class="alt">
<span>    </span><span class="vars">$customer</span><span>->deleteOrder(9527);  </span>
</li>
<li><span>  }  </span></li>
<li class="alt"><span>   </span></li>
<li><span>}  </span></li>
<li class="alt"><span>   </span></li>
<li><span>Client::main();  </span></li>
<li class="alt"><span>?> </span></li>
</ol>
登录后复制

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

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

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

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板