查看原始碼 Phoenix.LiveView.Router (Phoenix LiveView v0.20.17)
提供用於 Phoenix 導向器元件的 LiveView 導向。
摘要
函式
擷取 LiveView 並加進控制器快閃記憶體。
替換 Phoenix.Router
使用的預設 :fetch_flash
插件。
範例
defmodule MyAppWeb.Router do
use LiveGenWeb, :router
import Phoenix.LiveView.Router
pipeline :browser do
...
plug :fetch_live_flash
end
...
end
定義 LiveView 路徑。
LiveView 可透過使用 live/4
巨集,帶有路徑和 LiveView 名稱來設定路由
live "/thermostat", ThermostatLive
預設情況下,您可透過使用 live_path
輔助函式,來為這個 LiveView 產生一條路徑
live_path(@socket, ThermostatLive)
HTTP 要求
透過
live/4
巨集定義的路徑,其響應的 HTTP 要求方法為GET
。
動作和 Live 導航
LiveView 通常具備多個狀態和多個 URL。例如,您可擁有在您的網路應用程式中列出所有文章的 LiveView。對於每篇文章,都有「編輯」按鈕,在按下時,開啟同一頁面上的模式來編輯文章。在這種情況下,最佳作法是使用 Live 導航,因此在您點擊編輯時,即使仍在同一個 LiveView 中,URL 也會變更為「/articles/1/edit」。類似地,您可能也想顯示「新增」按鈕,以開啟模式來建立新條目,並且您希望這會反映在 URL 中,顯示為「/articles/new」。
為了讓你更輕鬆地辨識你的 LiveView 目前在什麼「動作」,你也可以在定義 LiveView 時傳遞 action 選項
live "/articles", ArticleLive.Index, :index
live "/articles/new", ArticleLive.Index, :new
live "/articles/:id/edit", ArticleLive.Index, :edit
當給定一個動作時,產生的路由輔助程式會以 LiveView 本身命名(與控制器的方式相同)。對於上述範例,我們會有
article_index_path(@socket, :index)
article_index_path(@socket, :new)
article_index_path(@socket, :edit, 123)
目前的動作將始終在 LiveView 中以 @live_action
指派的形式提供,它可用於呈現一個 LiveComponent
<%= if @live_action == :new do %>
<.live_component module={MyAppWeb.ArticleLive.FormComponent} id="form" />
<% end %>
或者可用於顯示或隱藏範本的部分
<%= if @live_action == :edit do %>
<%= render("form.html", user: @user) %>
<% end %>
請注意,如果在路由定義中沒有提供動作,@live_action
將會是 nil
。
選項
:container
- LiveView 容器要使用的 HTML 標籤和 DOM 屬性的選用元組。例如:{:li, style: "color: blue;"}
。更多資訊和範例請見Phoenix.Component.live_render/3
。:as
- 選擇性地設定命名輔助程式。當在沒有動作的情況下使用 LiveView 時,預設為:live
;而當在有動作的情況下使用時,預設為 LiveView 名稱。:metadata
- 一個選用的映射,用於提供遙測事件和路由資訊的元資料,例如:%{route_name: :foo, access: :user}
。此資料可以透過呼叫Phoenix.Router.route_info/4
,並提供handle_params
回呼的uri
來擷取。這可以用於自訂化一個可能從不同路由呼叫的 LiveView。:private
- 一個選用的私有資料映射,用於放入 plug 連接 中,例如:%{route_name: :foo, access: :user}
。此資料將可以在 plug 函式中的conn.private
中取得。
範例
defmodule MyApp.Router
use Phoenix.Router
import Phoenix.LiveView.Router
scope "/", MyApp do
pipe_through [:browser]
live "/thermostat", ThermostatLive
live "/clock", ClockLive
live "/dashboard", DashboardLive, container: {:main, class: "row"}
end
end
iex> MyApp.Router.Helpers.live_path(MyApp.Endpoint, MyApp.ThermostatLive)
"/thermostat"
在群組中為 Live 路徑定義一個 Live 會話,用於執行 Live 重新導向。
live_session/3
允許使用 live/4
定義的路由來支援從客戶端透過 live_redirect
進行存活導向,導覽純粹透過現有的 WebSocket 連線進行。這允許在路由器中定義的直播路由掛載一個新的 root LiveView,而不需要向伺服器發出額外的 HTTP 請求。基於向後相容性的理由,所有在 herhangi bir live session 外部定義的 live 路由都被視為是單一未命名 live session 的一部分。
安全性考量
在一般的網路應用程式中,我們會對每個要求執行驗證和授權檢查。由於 LiveViews 會從一般的 HTTP 要求開始,它們會透過外掛程式與一般的要求共用驗證邏輯。在使用者通過驗證後,我們通常會在 mount
回應中驗證工作階段。授權規則通常會在 mount
(例如使用者是否允許查看此頁面?)和 handle_event
(使用者是否允許刪除此項目?)中發生。在 mount 中執行授權非常重要,因為 live_redirect
不會經過外掛程式管線。
live_session
可用於在 LiveViews 群組之間劃出界線。在 live_session
之間進行重新導向時,會強制重新載入整頁並建立全新的 LiveView 連線。當 LiveViews 需要不同的驗證策略,或僅僅是在它們使用不同的根佈景時(因為根佈景不會在重新導向期間更新),這項功能會很有用。
請 參閱我們的安全模型指南,以取得詳細說明和有關驗證、授權等的通用秘訣。
live_session
和forward
live_session
目前不支援forward
。LiveView 預期您的live
路由會永遠直接在您應用程式的路由器中定義。
live_session
和scope
使用
Phoenix.Router.scope/2
設定的別名不會在live_session
引數中進行展開。您必須改用完整的模組名稱。
選項
:session
- 額外的非強制工作階段對應或要與 LiveView 工作階段合併的多重身分驗證 (MFA) 組合。例如,%{"admin" => true}
或{MyMod, :session, []}
。對於 MFA,該函式會被呼叫,而且Plug.Conn
結構會被加在引數清單的最前面。:root_layout
- 針對初始 HTTP 行程式的非強制根佈景組合,用以覆寫路由器中設定的任何現有根佈景。:on_mount
- 非強制掛載生命週期清單,用於附加到工作階段中的每個 LiveView。請見Phoenix.LiveView.on_mount/1
。也接受傳遞單一值。:layout
- 非強制佈景,用於顯示 LiveView。設定此選項會使用use Phoenix.LiveView
覆寫佈景。此選項可以在 LiveView 中透過從 mount 回應回傳{:ok, socket, layout: ...}
來覆寫
範例
scope "/", MyAppWeb do
pipe_through :browser
live_session :default do
live "/feed", FeedLive, :index
live "/status", StatusLive, :index
live "/status/:id", StatusLive, :show
end
live_session :admin, on_mount: MyAppWeb.AdminLiveAuth do
live "/admin", AdminDashboardLive, :index
live "/admin/posts", AdminPostLive, :index
end
end
在以上的範例中,我們有兩個 live session。其中不同的 live views 之間的即時導覽是不可能的,而且總是會要求重新整理整個頁面。這在以上的範例中很重要,因為 :admin
live session 有驗證需求,由 on_mount: MyAppWeb.AdminLiveAuth
定義,而其他 LiveViews 是沒有的。
如果你有常規的 HTTP 路由(get, post 等)和 live
路由,那麼你需要在兩者當中進行相同的驗證和授權規則。例如,如果你要在上面的 :admin
live session 中加入一個 get "/admin/health"
進入點,那麼你必須建立你自己的外掛程式,來執行和 MyAppWeb.AdminLiveAuth
相同的驗證和授權規則,然後將它導入
live_session :admin, on_mount: MyAppWeb.AdminLiveAuth do
scope "/" do
# Regular routes
pipe_through [MyAppWeb.AdminPlugAuth]
get "/admin/health", AdminHealthController, :index
# Live routes
live "/admin", AdminDashboardLive, :index
live "/admin/posts", AdminPostLive, :index
end
end
反之亦然,如果你有常規的 http 路由,而且你想加你自己的 live
路由,那麼由 pipe_through
內列出的外掛程式所執行的驗證和授權檢查必須導入 LiveViews,並通過 on_mount
函數來執行。