Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 我可以把插头放在哪里,然后在我的Phoenix应用程序的不同控制器上使用它们?_Elixir_Phoenix Framework - Fatal编程技术网

Elixir 我可以把插头放在哪里,然后在我的Phoenix应用程序的不同控制器上使用它们?

Elixir 我可以把插头放在哪里,然后在我的Phoenix应用程序的不同控制器上使用它们?,elixir,phoenix-framework,Elixir,Phoenix Framework,我正在创建我的第一个Elixir-Phoenix应用程序。我已经写了一些我想在多个控制器中使用的插件,现在有很多代码重复,因为插件代码在我所有的控制器中都被重复 我的问题是,是否有一个文件,我可以在其中放置所有插头,然后从不同的控制器访问和使用它们 # somefile to define my plugs defp load_subject(conn, _) do subject = Subject |> Repo.get conn.params["subject_id"]

我正在创建我的第一个
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

您可以将任何模块中的插头定义为公共函数:

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
然后在相关范围内通过管道输送