概觀
Bluesky Facade 是 BlueskyManager 的薄層封裝。BlueskyManager 管理多個 Agent,HasShortHand trait 則整合了常用方法的捷徑。
架構
BlueskyServiceProvider 將 Factory::class 註冊為 BlueskyManager 的 scoped 單例(每次請求 1 個實體)。
getFacadeAccessor() 會解析此綁定。
BlueskyManager 的核心方法
以下是BlueskyManager 自身定義的核心方法。將其與 HasShortHand trait 的方法分開理解,有助於掌握內部結構。
認證
Agent 操作
HTTP client
工具
HasShortHand trait
HasShortHand trait 將 AT Protocol 的低階 API 封裝為易讀的 PHP 方法。只要在 BlueskyManager 中寫入 use HasShortHand;,這些方法即可直接透過 Bluesky:: 呼叫。
之所以將
HasShortHand 獨立為 trait,是為了便於測試與客製化。透過此 trait,可讓 BlueskyManager 的程式碼保持精簡,同時提供豐富的 API 捷徑。貼文 / feed
互動
追蹤
個人資料 / 帳號
媒體
通知
AT Protocol record 操作
Feed generator / labeler
常用捷徑範例
貼文
回覆
回覆時透過Post::build() 設定父貼文的 StrongRef。HasShortHand 中並沒有專用的 reply() 方法,而是將 Post 物件傳給 post()。
按讚 / 轉發
更新個人資料
upsertProfile() 會取得目前的個人資料,並儲存於閉包中修改的內容。可透過 Profile 物件的方法設定 displayName、description 等。
設定 self label
可以透過SelfLabels 對整個帳號設定 self label。
直接呼叫任意 API
HasShortHand 中沒有的方法,可使用 send() 或 client()。
透過 Facade 與直接使用的差異
Bluesky::post() 與 app(Factory::class)->post() 對應的是同一個 BlueskyManager 實體。
scoped 註冊,因此在一次請求內,login() 之後的 session 狀態會被保留。
Conditionable 與 Macroable
BlueskyManager 同時使用了 Conditionable 與 Macroable trait。
Conditionable:when() / unless()
Macroable:新增自訂方法
透過macro() 可從應用程式端向 BlueskyManager 增加方法。通常在 AppServiceProvider 的 boot() 中定義。
插入自訂 Agent
透過withAgent() 可直接設定任意的 Agent 實作。
一般認證(
login() / withToken())會自動設定 agent,因此直接使用 withAgent() 的機會主要在測試時。參考連結
- 認證方式比較 — App Password 與 OAuth 的詳細差異
- Basic client — 認證後的 API 操作範例
- 測試 — 使用 Fake 進行測試的方式
- Source:src/BlueskyManager.php
- Source:src/HasShortHand.php