ThinkPHP的LIB目录下默认有Action,Behavor,Widget三个文件夹,Behavor与Widget没有用到就没有也了解,Action层可以看做是对用户行为的一种抽象,比如用户想登陆、注册、加关注、翻译单词都会被抽象为Action层的某个方法,在具体的实践中发现有这样一个问题,有时候用户的行为需要多个Action联合才能完成,ThinkPHP提供了一个R方法来完成跨Action调用,使用这个方法中似乎会导致用户URL改变,于是就萌生了Action层中再增加一层Logic层,来解决跨Action的逻辑问题,Logic层的核心职责是需要分散的多个Action联合才能完成任务聚合在一起,比如用户的某个行为需要多个Action分别去处理数据库的多张表,但现在转发给Logic层,由Logic去处理这些表。有了Logic层,就有一个好处不必在需要跨Action就能使用另一个Action提供的功能了,因为每一个Action提供的功能实际上是由Logic层去完成,只要准备好Logic层方法需要的参数,不管参数是从web里get或者post过来,还是直接代码里填写都无所谓了。
FollowerLogic.class.php实现的的用户相互关注,
1: <?php
2:
3: class FollowerLogic {
4:
5: protected $follower_model = null;
6: protected $user_model = null;
7:
8: public function __construct() {
9:
10: $this->follower_model = D('Follower');
11: $this->user_model = D('User');
12: }
13:
14: public function AddPublicFollower($uid, $follower_ids) {
15: // TODO 现在虽然是很想支持数组的操作,但现在这个接口有问题,
16: // 只在应用层一个一个的加/删
17: if (is_array($follower_ids)) {
18: // TODO 这个分支暂时不会走到
19: // 加入自己的观察列表
20: ..
21:
22: } else {
23:
24: // 加入自己的观察列表
25: ...
26: }
27: }
28:
29: public function DeletePublicFollwer($uid, $follower_ids) {
30:
31: if (is_array($follower_ids)) {
32:
33: // 反射删除自己的观察列表
34: ...
35:
36: } else {
37:
38: // 反射删除自己的观察列表
39: ...
40: }
41: }
42:
43: //
44: public function AddQuietFollower($uid, $follower_ids) {
45:
46: }
47:
48: public function DeleteQuietFollower($uid, $follower_ids) {
49: // TODO
50:
51: }
52:
53: // TODO 这里会按照策略来
54: public function GetFollowers() {
55: $data = $this->user_model->field('_id')->select();
56: return $data;
57: }
58: }
user_model与follower_model映射的两张表,根据不同的表设计,加关注系统的实现都是不一样的,这时不同的Action均可调用FollowrLogic提供的方法实现加关注,而不必是一个特定的URL了。
为了让ThinkPHP自动加载这个php脚本,需要在Conf目录下alias.php加上下面这一行代码,
1: <?php
2: return array(
3: ....
4: 'FollowerLogic' => LIB_PATH.'Logic/FollowerLogic.class.php',
5: ...
6: );