从插头内拨打插头

She*_*yar 3 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
Run Code Online (Sandbox Code Playgroud)

但它抛出一个CompileError,说:undefined function plug

Dog*_*ert 9

你可以简单地Plug.Builder用于此:

defmodule MyApp.SpecialPlug do
  use Plug.Builder

  plug SimplePlug1
  plug SimplePlug2, args: :something
end
Run Code Online (Sandbox Code Playgroud)

这将定义initcall自动顺序传递connSimplePlug1然后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
Run Code Online (Sandbox Code Playgroud)

请注意,您必须halted: true按上述方式为自己添加检查(除非您出于某种原因要忽略暂停).Plug.Builder自动为你做同样的事情

得到相当于:

plug SimplePlug1
plug SimplePlug2, args: :something
Run Code Online (Sandbox Code Playgroud)

你现在可以这样做:

plug MyApp.SpecialPlug, {[], [args: :something]}
Run Code Online (Sandbox Code Playgroud)