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
你可以简单地Plug.Builder用于此:
defmodule MyApp.SpecialPlug do
use Plug.Builder
plug SimplePlug1
plug SimplePlug2, args: :something
end
Run Code Online (Sandbox Code Playgroud)
这将定义init并call自动顺序传递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
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)