尝试了解Plug,特别是Plug.Router。从文档(http://hexdocs.pm/plug/Plug.Router.html)。根据规范,插件有一个init函数,在初始化时调用以传递选项,但那些似乎在定义的路径中不可用。
没有可用选项的原因是什么,是否有允许它的模式?
答案 0 :(得分:8)
这是本书的摘录 - 编程菲尼克斯:
“有时候,你可能需要Phoenix做一些繁重的工作来转换选项。这是init函数的工作。 init在编译时发生。插件将使用init的结果作为第二个调用的参数。因为init经常在编译时调用,所以它是验证选项和准备一些工作的最佳位置。这样,调用可以尽可能快。因为调用是主力,我们希望它做尽可能少的工作。“
例如 - 在routes.ex文件中使用插件
pipeline :api do
plug :accepts, ["json"]
plug Example.Authenticated, repo: Example.Repo
end
repo: Example.Repo
是传递的选项 - 在Example.Repo中的init
函数
defmodule Example.Authenticated do
import Plug.Conn
def init(opts) do
Keyword.fetch!(opts, :repo)
end
def call(conn, repo) do
...
end
end
我假设在Plug.Router的情况下 - 在编译时修改可能是 - 加载构建/修改路由的模块 - 可能来自外部源?取决于你想要完成的任务。
答案 1 :(得分:0)
init函数的工作主要是使选项在编译时可用。然后将此选项作为第二个参数传递给call函数。
我认为我可以根据插头功能或模块要完成的任务决定是否选择选项。