查看原始碼 Phoenix.LiveView.Router (Phoenix LiveView v0.20.17)

提供用於 Phoenix 導向器元件的 LiveView 導向。

摘要

函式

擷取 LiveView 並加進控制器快閃記憶體。

在群組中為 Live 路徑定義一個 Live 會話,用於執行 Live 重新導向。

函式

連結至這個函式

fetch_live_flash(conn, opts \\ [])

查看原始碼

擷取 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
連結至這個巨集

live(path, live_view, action \\ nil, opts \\ [])

查看原始碼 (巨集)

定義 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_session(name, opts \\ [], list)

查看來源 (巨集)

在群組中為 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_sessionforward

live_session 目前不支援 forward。LiveView 預期您的 live 路由會永遠直接在您應用程式的路由器中定義。

live_sessionscope

使用 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 函數來執行。