从插头内拨打插头

时间:2016-09-26 10:08:08

标签: elixir phoenix-framework

我每次都拨打一些插头。我想创建一个单独的插件,为我调用所有这些。我该怎么做呢?

这是我目前试图做的事情:

defmodule MyApp.SpecialPlug do
  import Plug.Conn

  def init(default), do: default

  def call(conn, default) do
    plug SimplePlug1
    plug SimplePlug2, args: :something
  end
end

但它会抛出CompileError,说:undefined function plug

1 个答案:

答案 0 :(得分:9)

您只需使用Plug.Builder

defmodule MyApp.SpecialPlug do
  use Plug.Builder

  plug SimplePlug1
  plug SimplePlug2, args: :something
end

这会自动定义initcall,这会将conn依次传递给SimplePlug1,然后传递SimplePlug2

如果您真的想手动调用插件,可以执行以下操作:

defmodule MyApp.SpecialPlug do
  def init({opts1, opts2}) do
    {SimplePlug1.init(opts1), SimplePlug2.init(opts2)}
  end

  def call(conn, {opts1, opts2}) do
    case SimplePlug1.call(conn, opts1) do
      %Plug.Conn{halted: true} = conn -> conn
      conn -> SimplePlug2.call(conn, opts2)
    end
  end
end

请注意,您必须自己添加halted: true自己的检查(除非您因某种原因想忽略暂停)。 Plug.Builder会自动为您做同样的事情

获得相当于:

plug SimplePlug1
plug SimplePlug2, args: :something
你现在可以做到:

plug MyApp.SpecialPlug, {[], [args: :something]}