在Plug.Router中,init函数有什么意义?

时间:2016-01-28 05:13:04

标签: elixir

尝试了解Plug,特别是Plug.Router。从文档(http://hexdocs.pm/plug/Plug.Router.html)。根据规范,插件有一个init函数,在初始化时调用以传递选项,但那些似乎在定义的路径中不可用。

没有可用选项的原因是什么,是否有允许它的模式?

2 个答案:

答案 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函数。

我认为我可以根据插头功能或模块要完成的任务决定是否选择选项。