Где я могу поместить свои вилки, а затем использовать их с разных контроллеров в своем приложении Phoenix?
Я создаю свое первое приложение Elixir
- Phoenix
. Я написал несколько штепселей, которые я хочу использовать в нескольких контроллерах, прямо сейчас существует много дубликатов кода, поскольку код Plug повторяется во всех моих контроллерах.
Мой вопрос: есть файл, где я могу поместить все мои вилки, а затем получить доступ и использовать их с разных контроллеров?
# 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
Ответы
Ответ 1
Вы можете определить пробки в любом модуле как общедоступные функции:
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
в соответствующих областях.