檢視來源 Phoenix.VerifiedRoutes (Phoenix v1.7.14)
提供編譯時驗證的路線產生。
使用 sigil_p
巨集可在應用程式中的路徑和 URL 於編譯時相較 Phoenix 路由器進行驗證。例如,下列路徑和 URL 用法
<.link href={~p"/sessions/new"} method="post">Log in</.link>
redirect(to: url(~p"/posts/#{post}"))
將相較於標準 Phoenix.Router
定義進行驗證
get "/posts/:post_id", PostController, :show
post "/sessions/new", SessionController, :create
不匹配的路線將發出編譯器警告
warning: no route path for AppWeb.Router matches "/postz/#{post}"
lib/app_web/controllers/post_controller.ex:100: AppWeb.PostController.show/2
此外,插補的 ~p 值透過 Phoenix.Param
通訊協定進行編碼。例如,應用程式中的 %Post{}
結構可衍生 Phoenix.Param
通訊協定,以產生基於標籤的路徑,而非基於身分的標籤。這能讓你在應用程式中使用 ~p"/posts/#{post}"
而非 ~p"/posts/#{post.slug}"
。參閱 Phoenix.Param
文件取得更多詳細資料。
驗證路線也支援查詢字串,採用傳統查詢字串格式
~p"/posts?page=#{page}"
或作為關鍵字或值的清單、地圖
params = %{page: 1, direction: "asc"}
~p"/posts?#{params}"
類似於路徑區段,查詢字串參數採用適當的 URL 編碼,並可直接插補至 ~p 字串。
選項
如需在應用程式模組中驗證路線,例如控制器、範本和檢視,請use Phoenix.VerifiedRoutes
。該選項支援下列選項
:router
- 必填路線器,用於對照 ~p 路徑:endpoint
- 可選端點,用於 ~p script_name 和 URL 產生:statics
- 可選靜態目錄清單,用於當作已驗證路徑
例如
use Phoenix.VerifiedRoutes,
router: AppWeb.Router,
endpoint: AppWeb.Endpoint,
statics: ~w(images)
用法
應用程式的絕大多數路徑和 URL 產生需求都能透過 ~p
和 url/1
滿足,其中所有必要的資訊都能透過傳遞至 use Phoenix.VerifiedRoutes
的端點和路由器中的編譯時資訊提供,以建構路徑或 URL。
有鑑於此,有些情況需要 path/2
、path/3
、url/2
和 url/3
當
%Plug.Conn{}
、%Phoenix.LiveSocket{}
或%URI{}
的執行時期值決定路徑或 URL 的形成,這會在以下情況下發生Phoenix.Controller.put_router_url/2
用於覆寫端點的網址Phoenix.Controller.put_static_url/2
用於覆寫端點的靜態網址
當 Router 模組與傳遞給
use Phoenix.VerifiedRoutes
的模組不同時,例如程式庫程式碼或依賴多個路由器的應用程式程式碼。在這種情況下,路由器模組可以明確提供給path/3
和url/3
。
追蹤警告
所有靜態路徑區段都必須以正斜線開頭,並且在動態插補之間必須有一個靜態區段,才能讓路由在沒有任何警告的情況下進行驗證。例如,以下是正確示範
~p"/media/posts/#{post}"
以下是編譯器看不到完整路徑的範例
type = "posts"
~p"/media/#{type}/#{post}"
在這種情況下,最好撰寫一個函式,例如 media_path/1
,並分支為不同的 ~p
來處理每種類型。
與任何其他編譯警告一樣,只要儲存 ~p
的檔案有任何變更,或是路由器變更,Elixir 編譯器就會發出警告。若要查看之前針對沒有任何變更的檔案所發出的警告,可以將 --all-warnings
旗標傳遞給 mix compile
任務。以下是顯示編譯器在編譯目前的應用程式程式碼時所遇到的所有警告
$ mix compile --all-warnings
*注意:需要 Elixir >= 1.14.0 才能進行全面的警告。舊版本會正確編譯,但不會發出任何警告。
摘要
函式
產生路由路徑並驗證路由。
產生路由路徑並驗證路由。
根據靜態資產的檔案路徑產生完整性雜湊。
根據靜態資產的檔案路徑產生路徑。
根據靜態資產的檔案路徑產生 URL。
傳回沒有驗證的路徑以及相關指令碼名稱字首。
傳回沒有驗證的路徑的端點 URL。
產生路由 URL 並驗證路由。
從連線、socket 或 URI 產生路由 URL 並驗證路由。
從連線、socket 或 URI 以及路由器產生 URL 並驗證路由。
函式
產生路由路徑並驗證路由。
有關更多資訊,請參考 sigil_p/2
。
在提供的路徑與路由器中指定的 use Phoenix.VerifiedRoutes
或 @router
模組屬性不符時,會發出警告。
範例
import Phoenix.VerifiedRoutes
redirect(to: path(conn, ~p"/users/top"))
redirect(to: path(conn, ~p"/users/#{@user}"))
~H"""
<.link href={path(@uri, "/users?page=#{@page}")}>profile</.link>
<.link href={path(@uri, "/users?#{@params}")}>profile</.link>
"""
產生路由路徑並驗證路由。
有關更多資訊,請參考 sigil_p/2
。
在提供的路徑與路由器參數中指定的路由器不符時,會發出警告。
範例
import Phoenix.VerifiedRoutes
redirect(to: path(conn, MyAppWeb.Router, ~p"/users/top"))
redirect(to: path(conn, MyAppWeb.Router, ~p"/users/#{@user}"))
~H"""
<.link href={path(@uri, MyAppWeb.Router, "/users?page=#{@page}")}>profile</.link>
<.link href={path(@uri, MyAppWeb.Router, "/users?#{@params}")}>profile</.link>
"""
產生路由路徑並驗證路由。
插入名稱的參數會透過 Phoenix.Param
通訊協定進行編碼。
在提供的路徑與路由器中指定的 use Phoenix.VerifiedRoutes
或 @router
模組屬性不符時,會發出警告。
範例
use Phoenix.VerifiedRoutes, endpoint: MyAppWeb.Endpoint, router: MyAppWeb.Router
redirect(to: ~p"/users/top")
redirect(to: ~p"/users/#{@user}")
~H"""
<.link href={~p"/users?page=#{@page}"}>profile</.link>
<.link href={~p"/users?#{@params}"}>profile</.link>
"""
根據靜態資產的檔案路徑產生完整性雜湊。
有關更多資訊,請參考 Phoenix.Endpoint.static_integrity/1
。
範例
iex> static_integrity(conn, "/assets/app.js")
"813dfe33b5c7f8388bccaaa38eec8382"
iex> static_integrity(socket, "/assets/app.js")
"813dfe33b5c7f8388bccaaa38eec8382"
iex> static_integrity(AppWeb.Endpoint, "/assets/app.js")
"813dfe33b5c7f8388bccaaa38eec8382"
根據靜態資產的檔案路徑產生路徑。
有關更多資訊,請參考 Phoenix.Endpoint.static_path/1
。
範例
iex> static_path(conn, "/assets/app.js")
"/assets/app-813dfe33b5c7f8388bccaaa38eec8382.js"
iex> static_path(socket, "/assets/app.js")
"/assets/app-813dfe33b5c7f8388bccaaa38eec8382.js"
iex> static_path(AppWeb.Endpoint, "/assets/app.js")
"/assets/app-813dfe33b5c7f8388bccaaa38eec8382.js"
iex> static_path(%URI{path: "/subresource"}, "/assets/app.js")
"/subresource/assets/app-813dfe33b5c7f8388bccaaa38eec8382.js"
根據靜態資產的檔案路徑產生 URL。
有關更多資訊,請參考 Phoenix.Endpoint.static_url/0
和 Phoenix.Endpoint.static_path/1
。
範例
iex> static_url(conn, "/assets/app.js")
"https://example.com/assets/app-813dfe33b5c7f8388bccaaa38eec8382.js"
iex> static_url(socket, "/assets/app.js")
"https://example.com/assets/app-813dfe33b5c7f8388bccaaa38eec8382.js"
iex> static_url(AppWeb.Endpoint, "/assets/app.js")
"https://example.com/assets/app-813dfe33b5c7f8388bccaaa38eec8382.js"
傳回沒有驗證的路徑以及相關指令碼名稱字首。
範例
iex> unverified_path(conn, AppWeb.Router, "/posts")
"/posts"
iex> unverified_path(conn, AppWeb.Router, "/posts", page: 1)
"/posts?page=1"
傳回沒有驗證的路徑的端點 URL。
範例
iex> unverified_url(conn, "/posts")
"https://example.com/posts"
iex> unverified_url(conn, "/posts", page: 1)
"https://example.com/posts?page=1"
產生路由 URL 並驗證路由。
有關更多資訊,請參考 sigil_p/2
。
在提供的路徑與路由器中指定的 use Phoenix.VerifiedRoutes
或 @router
模組屬性不符時,會發出警告。
範例
use Phoenix.VerifiedRoutes, endpoint: MyAppWeb.Endpoint, router: MyAppWeb.Router
redirect(to: url(conn, ~p"/users/top"))
redirect(to: url(conn, ~p"/users/#{@user}"))
~H"""
<.link href={url(@uri, "/users?#{[page: @page]}")}>profile</.link>
"""
當您想要驗證傳遞到 use Phoenix.VerifiedRoutes
之外的路由器的路由,也可以提供路由器
redirect(to: url(conn, OtherRouter, ~p"/users"))
轉發路由也會自動解析。例如,假設您的主路由器有一個管理員路由器的轉發路徑
defmodule AppWeb.Router do
...
forward "/admin", AppWeb.AdminRouter
end
defmodule AppWeb.AdminRouter do
...
get "/users", AppWeb.Admin.UserController
end
在你的主要應用程式路由器轉發的路徑會如常驗證,比如 ~p"/admin/users"
。
從連線、socket 或 URI 產生路由 URL 並驗證路由。
請參閱 url/1
以取得更多資訊。
從連線、socket 或 URI 以及路由器產生 URL 並驗證路由。
請參閱 url/1
以取得更多資訊。