Подтвердить что ты не робот

Где я могу поместить свои вилки, а затем использовать их с разных контроллеров в своем приложении 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
4b9b3361

Ответ 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 в соответствующих областях.