gpt4 book ai didi

elixir - 我可以将插头放在哪里,然后从 Phoenix 应用程序中的不同 Controller 使用它们?

转载 作者:行者123 更新时间:2023-12-02 21:11:07 25 4
gpt4 key购买 nike

我正在创建我的第一个 Elixir-Phoenix 应用程序。我已经编写了一些想要在多个 Controller 中使用的插件,现在有很多代码重复,因为插件代码在我的所有 Controller 中重复。

我的问题是是否有一个文件可以放置我的所有插件,然后从不同的 Controller 访问和使用它们

# somefile to define my plugs

defp load_subject(conn, _) do
subject = Subject |> Repo.get conn.params["subject_id"]

assign(conn, :subject, subject)
end

defp load_topic(conn, _) do
topic = Topic |> Repo.get conn.params["topic_id"]

conn |> assign :topic, topic
end

然后在我的 Controller 中使用它们:

# First Controller
defmodule MyApp.FirstController do
use MyApp.Web, :controller

plug :load_subject
plug :load_topic
plug :action

def some_action(conn, _) do
# do something
end

def another_action(conn, _) do
# do some other thing
end
end

# Second Controller
defmodule MyApp.SecondController do
use MyApp.Web, :controller

plug :load_subject
plug :load_topic
plug :action

def lame_action(conn, _) do
# do something
end

def cool_action(conn, _) do
# do some other thing
end
end

最佳答案

您可以将任何模块中的插件定义为公共(public)函数:

defmodule MyApp.Loaders do
import Plug.Conn

def load_subject(conn, _) do
subject = Subject |> Repo.get conn.params["subject_id"]
assign(conn, :subject, subject)
end

def load_topic(conn, _) do
topic = Topic |> Repo.get conn.params["topic_id"]
conn |> assign :topic, topic
end
end

现在您可以将其导入 Controller 并使用插件:

defmodule MyApp.Controller do
use MyApp.Web, :controller
import MyApp.Loaders

plug :load_subject
plug :load_topic
plug :action

...
end

或者,您也可以在路由器中创建管道:

import MyApp.Loaders

pipeline :with_subject_and_topic do
plug :load_subject
plug :load_topic
end

然后在相关范围内pipe_through它。

关于elixir - 我可以将插头放在哪里,然后从 Phoenix 应用程序中的不同 Controller 使用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30960353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com