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

Pec*_*eck 8 elixir

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

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

ori*_*n_e 10

这是本书的摘录 - 编程凤凰:

"有时候,你可能需要Phoenix来做一些繁重的工作来转换选项.这是init函数的工作.init在编译时发生 .Plug会使用init的结果作为第二个参数来调用.因为init经常被调用编译时间,它是验证选项和准备一些工作的理想场所.这样,呼叫可以尽可能快.由于呼叫是主力,我们希望它尽可能少地工作."

例如 - 在routes.ex文件中使用插件

  pipeline :api do
    plug :accepts, ["json"]
    plug Example.Authenticated, repo: Example.Repo
  end
Run Code Online (Sandbox Code Playgroud)

repo: Example.Repo是传递的选项 - 到initExample.Repo中的函数

defmodule Example.Authenticated do
  import Plug.Conn

  def init(opts) do 
   Keyword.fetch!(opts, :repo)
  end

  def call(conn, repo) do
   ...
  end

end
Run Code Online (Sandbox Code Playgroud)

我假设在Plug.Router的情况下 - 在编译时可以修改 - 加载构建/修改路由的模块 - 可能来自外部源?取决于你想要完成的事情.

  • 这应该是答案.我是Phoenix和Plug的新用户,编译时方面在线文档中并不明显.我无法弄清楚为什么一个简单的测试记录功能没有被击中,但因为它在编译时是有意义的. (2认同)