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: );
