用途:这是一份针对 Phoenix 应用的思维模式指南,用于纠正典型 Web 框架习惯,帮助开发者正确使用 LiveView 生命周期、数据加载与安全模式。
主要能力与要点:
- 数据加载位置:默认在 mount/3 加载数据;mount 与 handle_params/3 在首次加载时都会运行两次(HTTP 死渲染 + WebSocket 连接),这是 LiveView 生命周期而非缺陷。handle_params/3 用于随实时导航(push_patch 或 <.link patch={...}>)变化的数据,因为 mount 在 patch 时不会重跑。真正处理重复加载的工具是 connected?(socket)、assign_async/3 与 assign_new/3;assign_new/3 只复用上游 Plug 或父 LiveView 已设置的值,不会去重任意工作。
- Scope 安全优先模式(Phoenix 1.8+):通过 Scope 自动串联授权上下文,避免越权查询;PubSub 主题必须按组织等维度隔离,否则会造成租户间数据泄露。
- 外部轮询应使用单个 GenServer 拉取并通过 PubSub 广播,而非每个 LiveView 直接调用外部 API。
- 组件职责:函数组件仅展示、无内部状态;LiveComponent 拥有自身状态与事件;LiveView 拥有整页、URL 与顶层状态。
- 异步加载使用 assign_async/3。
已知陷阱:LiveView 的 terminate/2 需要 trap_exit 才会触发,建议用独立 GenServer 通过 Process.monitor/1 监控并处理 :DOWN;同名 start_async 后发者胜,需先 cancel_async/3;Channel 拦截中的 socket 状态是订阅时快照,可能过期;组件 CSS 类优先级由样式表顺序决定,建议用 variant 属性;%Plug.Upload{} 的 content_type 由用户提供不可信,需校验文件内容并重写文件名与扩展名;Webhook 验签需在 Plug.Parsers 之前读取原始 body,且不要使用 preserve_req_body: true。
限制:资料未提供安装命令、版本要求或具体平台信息。