如何将插件加载的数据传递给 LiveView 组件

Dom*_*nic 4 elixir phoenix-live-view

您好,我使用不同的域名来加载不同的数据集。我目前正在使用自定义插件根据主机名加载正确的域 ID。endpoint.ex例如,在我的路由器之前得到了这个:

plug WebApp.DomainCheck
socket "/live", Phoenix.LiveView.Socket, websocket: [connect_info: [session: @session_options]]
...
plug WebApp.Router
Run Code Online (Sandbox Code Playgroud)

defmodule WebApp.DomainCheck do
  import Plug.Conn
  @behaviour Plug

  def init([]), do: []

  def call(conn, _options \\ []) do
    domains = Model.load_allowed_domains()
    case Map.get(domains, conn.host) do
      nil ->
        conn
        |> resp(401, "Domain not allowed")
        |> halt()

      domain_id ->
        conn
        |> assign(:domain_id, domain_id)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

现在这可以正常工作,View因为我domain_id在每个项目中都有分配。但是如何将数据从插头domain注入到我的设备中呢?LiveView

目前,我已将相同的域检查代码复制到每个 LiveViews mount()页面中:

defmodule WebApp.WelcomeLive do
  use WebApp, :live_view

  @impl true
  def mount(_args, _session, socket) do
    domains = Model.load_allowed_domains()
    host = socket.host_uri.host
    case Map.get(domains, host) do
      nil -> {:error, "Domain not allowed"}
      domain_id -> {:ok, assign(socket, :domain_id, domain_id)}
    end
  end
Run Code Online (Sandbox Code Playgroud)

有什么方法可以让插件有效地将这些数据推送到实时视图,而无需向每个安装添加代码?

Eva*_*tti 6

我的应用程序中有一个类似的用例,其中我的插件将结构放在user上面assigns,我想将这些数据保留在实时视图中,而不需要重新加载所有内容。

我实现这一目标的唯一方法是使用通过 MFA 的路线中的选项。 sessionlive

在路由器中你会有类似的东西

live "/page", WebApp.SomeLiveView, :show, session: {WebAppp.Helpers, :keep_domain_id, []}
Run Code Online (Sandbox Code Playgroud)

并且您WebApp.Helpers将拥有该函数返回您想要传递到实时视图的内容session

defmodule WebApp.Helpers do
  def keep_domain_id(conn) do
    %{"domain_id" => conn.assigns.domain_id}
  end
end
Run Code Online (Sandbox Code Playgroud)

然后在你的mounton 你就会有"domain_id"钥匙在你的session

defmodule WebApp.WelcomeLive do
  use WebApp, :live_view

  @impl true
  def mount(_args, %{"domain_id" => domain} = _session, socket) do
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)