概览
Bluesky Facade 是 BlueskyManager 的一层薄封装。BlueskyManager 负责管理多个 Agent,而 HasShortHand trait 集中提供了一批常用方法的快捷方式。
架构
BlueskyServiceProvider 会将 Factory::class 以作用域单例(scoped singleton,每次请求一个实例)的形式注册为 BlueskyManager。
getFacadeAccessor() 会解析这个绑定。
BlueskyManager 的核心方法
BlueskyManager 自身定义的核心方法如下。将它们与 HasShortHand trait 提供的方法区分开来,有助于理解内部结构。
认证
Agent 操作
HTTP 客户端
工具方法
HasShortHand trait
HasShortHand trait 把 AT Protocol 的底层 API 包装成了对 PHP 更友好的方法。只要在 BlueskyManager 中写上 use HasShortHand;,这些方法就可以直接通过 Bluesky:: 调用。
把
HasShortHand 拆成独立 trait,是为了便于测试和自定义。这样既能保持 BlueskyManager 代码简洁,又能提供丰富的 API 快捷方式。发帖 / feed
互动
关注
个人资料 / 账号
媒体
通知
AT Protocol 记录操作
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