我可以在哪里放置我的插头,然后在我的 Phoenix 应用程序中从不同的控制器使用它们?
Where can I put my Plugs and then use them from different controllers in my Phoenix app?
我正在创建我的第一个 Elixir
-Phoenix
应用程序。我已经写了一些我想在多个控制器中使用的插件,现在有很多代码重复,因为插件代码在我所有的控制器中重复。
我的问题是,是否有一个文件可以放置我所有的插件,然后从不同的控制器访问和使用它们 ?
# 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
然后在我的控制器中使用它们:
# 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
现在您可以将其导入您的控制器并使用插件:
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
应用程序。我已经写了一些我想在多个控制器中使用的插件,现在有很多代码重复,因为插件代码在我所有的控制器中重复。
我的问题是,是否有一个文件可以放置我所有的插件,然后从不同的控制器访问和使用它们 ?
# 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
然后在我的控制器中使用它们:
# 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
现在您可以将其导入您的控制器并使用插件:
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
它在相关范围内。