【问题标题】:Where can I put my Plugs and then use them from different controllers in my Phoenix app?我可以将我的 Plugs 放在哪里,然后在我的 Phoenix 应用程序中通过不同的控制器使用它们?
【发布时间】:2015-06-21 01:09:17
【问题描述】:

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

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案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 在相关范围内。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-06
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多