6
試圖理解Plug,特別是Plug.Router。從文檔(http://hexdocs.pm/plug/Plug.Router.html)。從規範中,插件有一個初始化函數,它在初始化時被調用來傳遞選項,但是這些在定義的路徑中似乎不可用。在Plug.Router中init函數的作用是什麼?
沒有可用選項的原因是什麼,並且是否存在允許它的模式?
試圖理解Plug,特別是Plug.Router。從文檔(http://hexdocs.pm/plug/Plug.Router.html)。從規範中,插件有一個初始化函數,它在初始化時被調用來傳遞選項,但是這些在定義的路徑中似乎不可用。在Plug.Router中init函數的作用是什麼?
沒有可用選項的原因是什麼,並且是否存在允許它的模式?
繼承人從一本書的摘錄 - 編程鳳凰:
「有時候,你可能需要鳳凰做一些繁重的改造方案這是初始化函數的工作初始化發生在編譯時。 Plug會使用init的結果作爲第二個參數來調用,因爲init通常在編譯時被調用,所以它是驗證選項和準備一些工作的最佳位置,這樣調用就可以儘可能快。呼叫是主力,我們希望它做盡可能少的工作。「
例如 - 在您的routes.ex文件中使用插件
pipeline :api do
plug :accepts, ["json"]
plug Example.Authenticated, repo: Example.Repo
end
repo: Example.Repo
是正在傳遞的選項 - 在init
函數內部Example.Repo
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的情況下 - 在編譯時修改可能是 - 加載模塊建立/修改路線 - 可能來自外部來源?取決於你想要完成的事情。
這應該是答案。我是Phoenix和Plug的新用戶,編譯時間方面從聯機文檔中並不明顯。我無法弄清楚爲什麼一個簡單的測試日誌功能沒有受到影響,但是由於它在編譯時這是有道理的。 – ibgib